深搜专题996(一)
搞心态了属于是。。。。。

先上我的
#include<bits/stdc++.h>
using namespace std;
int N;
int s[101];
int g[101];
int h[101];
int r[101];
int c;
int total = 0;
bool up(int a,int b){
return a>b;
}
bool cmp(int a[101]){
int total = 0;
for(int i = 1;i<=N;i++){
if(a[i] == g[i]) total++;
}
if(total != N) return 1;
else return 0;
}
int print(){
int y = 1;
int f = 0;
for(int i = 1;i<=N;i++){
for(int j = 1;j<=N;j++){
if(h[i] == s[j]){
r[y] = i;
y++;
}
}
}
for(int v = 1;v<=N;v++){
if(s[v]) f++;
}
sort(r+1,r+y+1,up);
for(int k = 1;k<=f;k++){
cout<<h[r[k]]<<" ";
}
}
int main(){
cin>>N>>c;
for(int i = 1;i<=N;i++){
cin>>s[i];
h[i] = s[i];
}
int kk = 0;
do{
int l = 0;
for(int j = 1;j<=N;j++){
l+=s[j];
if(l == c&&cmp(s)){
print();
kk = 1;
}
}
if(kk == 1) break;
}
while(next_permutation(s+1,s+N+1));
if(kk == 0) cout<<"No Solution!";
return 0;
}
可恶。。。No Solution的S大写卡了我好久。。。。
深搜+特判+去重 AC搞定;

二位数组(可以这么写)与深搜的碰撞 大部分时间卡在了MLE和TLE上 上动态数组依旧不行 最后采用了多个函数分离操作 大量剪枝
#include<bits/stdc++.h>
typedef long long ll ;
using namespace std;
const int N=10001;
int m,n,S,T;
int A[N],B[N],C[N],D[N],E[N],F[N],G[N],P[N],Q[N];
int total = 0;
int num=1;
void FIND()
{
int FF[1];
memset(FF,128/2,sizeof(FF));
m=FF[0];
}
ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void add(int x,int y,int z,int kl)
{
A[++num]=B[x];
B[x]=num;
C[num]=y;
D[num]=z;
E[num]=kl;
}
queue<int> ST;
bool IF()
{
for(int i=S;i<=T;i++)F[i]=m;
memset(Q,0,sizeof(Q));
ST.push(S),F[S]=0;
G[S]=1<<30,Q[S]=true;
while(!ST.empty())
{
int x=ST.front();
Q[x]=false;ST.pop();
for(int i=B[x];i;i=A[i])
{
int Kashimir=C[i];
if(F[Kashimir]>F[x]+E[i]&&D[i])
{
F[Kashimir]=F[x]+E[i];
G[Kashimir]=min(G[x],D[i]);
P[Kashimir]=i;
if(!Q[Kashimir])Q[Kashimir]=true,ST.push(Kashimir);
}
}
}
return F[T]!=m;
}
void Mark()
{
int x=T;
while(x!=S)
{
int i=P[x];
D[i]-=G[T];
D[i^1]+=G[T];
x=C[i^1];
}
total+=F[T]*G[T];
}
bool IF_d()
{
for(int i=S;i<=T;i++)F[i]=-m;
ST.push(S),F[S]=0;G[S]=1<<30;
while(!ST.empty())
{
int x=ST.front();
Q[x]=false;ST.pop();
for(int i = B[x];;i = A[i])
{
int Kashimir = C[i];
if(F[Kashimir]<F[x]+E[i]&&D[i])
{
F[Kashimir] = F[x]+E[i];
G[Kashimir] = min(G[x],D[i]);
P[Kashimir] = i;
if(!Q[Kashimir])Q[Kashimir] = true,ST.push(Kashimir);
}
}
}
return F[T]!=-m;
}
void Mark_d()
{
int x = T;
while(x!=S)
{
int i = P[x];
D[i]-=G[T];
D[i^1]+=G[T];
x = C[i^1];
}
total+=F[T]*G[T];
}
void add_x(int x,int y,int z,int kl)
{
add(x,y,z,kl);
add(y,x,0,-kl);
}
int main()
{
FIND();
n = read();S = 0,T = n*2+1;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
int x = read();
add_x(i,j+n,1,x);
}
}
for(int i = 1;i <= n;i++)add_x(S,i,1,0),add_x(i+n,T,1,0);
while(IF())Mark();
printf("%d",total);
total=0;
return 0;
}

3、4题放在一起写吧
3题还好 与第一题有着异曲同工之妙
第4题的话。。。可以走深搜 两次+特判 也可以用数学方法打表。。。。。
#include<bits/stdc++.h>
using namespace std;
int f[10005],w[10005];
int main(){
int v,n;
scanf("%d %d",&n,&v);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++){
for(int j=v;j>=w[i];j--){
f[j]=max(f[j],f[j-w[i]]+w[i]);
}
}
printf("%d",f[v]);
return 0;
}

浙公网安备 33010602011771号