POJ1011 POJ2362(9.7博文)

来源:互联网 发布:暴风影音软件下载 编辑:程序博客网 时间:2024/05/03 21:29

(忘了上传)

泪奔啊。。。神们两个月前过的题我现在才做,还不太会。。。呜呜。。。

首先鸣谢叶神。。。我终于把神博客里的搜索写完了。。。最后这两道还是看神的代码才会的。。。

总结些个:

基本上剪枝我都考虑到了但是,我的DFS写得是在是太挫了。。。我开始弄的两个变量然后递归。。。结果就是这个DFS就完全乱了。。。后来看了叶神的代码我也修改了些个,把其中一个弄成循环就好了。。。其实在我的递归的时候另一个的作用也不大。。。然后这两题都用了剪枝,开始我是从小到大的排序结果更乱。后来想到为什么不从大到小的搞。。。弄啊弄啊弄,现在终于把这个给弄完了。。。

上代码:(1011

#include<cstdio>
#include<cstring>
#include<algorithm>
usingnamespace std;
int a[110],c[110],n,ans,s;
int cmp(int a,intb){
returna>b;
}
void dfs(int i,int sum,int tot,int side){
intk;
//printf("%d%d%d\n",i,tot,side);
if(side==s){
//printf("wa\n");
//printf("%d%d\n",s,side);
ans=1;
return;
}
if(tot==sum){
//printf("%d%d%d\n",i,tot,side);
side++;
dfs(0,sum,0,side);
}
else{
for(k=i;k<=n-1;k++){
if(c[k]==0){
if(tot+a[k]<=sum){
c[k]=1;
dfs(k+1,sum,tot+a[k],side);
if(ans==0)
c[k]=0;
else
return;
if(sum-tot==a[k]||tot==0){//
这里可以注明一下:因为当a[k]都无法选的时候,选择x+y=a[k],将可以拼凑的木条选了就更不可能了。开始我就是用这样的方法在贪心结果WA了。。。
//ns=0;
 return;
}
                    


while(a[k]==a[k+1]&& k<=n)k++;
}

}

}
}
}
main(){
intt,sum,flag,i,k,j,b[3030];
//scanf("%d",&t);
while(scanf("%d",&n)!=-1&&n){
sum=0;
for(i=0;i<=n-1;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+n,cmp);
//printf("%d\n",sum);
k=0;
for(i=a[0];i<=sum;i++){
if(sum%i==0)
b[k++]=i;
}
//printf("%d%d\n",sum,k);
for(i=0;i<=k-1;i++){
ans=0;
memset(c,0,sizeof(c));
s=sum/b[i];
//printf("%d\n",ans);
dfs(0,b[i],0,0);
///printf("%d\n",ans);
if(ans==1){
printf("%d\n",b[i]);
break;
}
}
}
}

上代码:(2362)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[40],c[40],n,ans;
int cmp(int a,int b){
    return a>b;
}
void dfs(int i,int sum,int tot,int side){
    int k;
    //printf("%d %d %d\n",i,tot,side);
    if(side==4){
        ans=1;
        return;
    }
    if(tot==sum){
        //printf("%d %d %d\n",i,tot,side);
        side++;
        dfs(0,sum,0,side);
    }
    else{
        for(k=i;k<=n-1;k++){
            if(c[k]==0){
                if(tot+a[k]<=sum){
                    c[k]=1;
                    dfs(k+1,sum,tot+a[k],side);
                    if(ans==0)
                    c[k]=0;
                    else
                    return;
                    while(a[k]==a[k+1])k++;
                }
                
            }
            
        }
    }
}
main(){
    int t,sum,flag,i;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        sum=0;
        for(i=0;i<=n-1;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        sort(a,a+n,cmp);
        //printf("%d\n",sum);
        if(sum%4!=0){
            printf("no\n");
        }
        else{
            if(sum/4<a[0])
                printf("no\n");
            else{
                ans=0;
                memset(c,0,sizeof(c));
                dfs(0,sum/4,0,0);
                if(ans)
                    printf("yes\n");
                else
                    printf("no\n");
            }
        }
        
    }
}

最后再贴上我最开始的



原创粉丝点击