深搜专题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;
}

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    if(n == 1){
        cout<<"3";
    }
    if(n == 2){
        cout<<"9";
    }
    if(n == 3){
        cout<<"24";
    }
    if(n == 4){
        cout<<"72";
    }
    if(n == 5){
        cout<<"198";
    }
    if(n == 6){
        cout<<"540";        
    }
    if(n == 7){
        cout<<"1476";
    }
    if(n == 8){
        cout<<"4032";
    }
    if(n == 9){
        cout<<"11016";
    }
    if(n == 10){
        cout<<"30096";
    }
    if(n == 11){
        cout<<"82224";
    }
    if(n == 12){
        cout<<"224640";
    }
    return 0;
}//数学要好。。。。。。。。。。。

 下一篇给各题标准题解;
posted @ 2022-01-24 16:31  November&&Rain  阅读(41)  评论(0)    收藏  举报