(忘了上传)
泪奔啊。。。神们两个月前过的题我现在才做,还不太会。。。呜呜。。。
首先鸣谢叶神。。。我终于把神博客里的搜索写完了。。。最后这两道还是看神的代码才会的。。。
总结些个:
基本上剪枝我都考虑到了但是,我的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");
}
}
}
}
最后再贴上我最开始的