#include <stdio.h>
#define MAXM 7
int a[MAXM],sum,len;//,aa[MAXM]

bool DFS(int nowLen,int sum2,int val)...{
int i;
if(nowLen==len)...{
if(sum2==sum)
return 1;
else
return 0;
}
for(i=val;i<=6;i++)...{
if(a[i]>0)...{
a[i]--;
if(DFS(nowLen+1,sum2+i,i))
return 1;
a[i]++;
}
}
return 0;
}
int main()
...{
int i,j,n=0,n1,sum2,nowLen,val;
bool ok=0;
n=1;
scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
while (a[1] >0||a[2]>0||a[3]>0||a[4]>0||a[5]>0||a[6]>0) 
...{
if(a[6]>5)...{
if(a[6]%2==0)
a[6]=4;//aa[6]=
else
a[6]=5;//=aa[6]
}

if(a[5]>6)...{
if(a[5]%2==0)
a[5]=6;//=aa[5]
else
a[5]=5;//=aa[5]
}

if(a[4]>5)...{
if(a[4]%2==0)
a[4]=4;//aa[4]/
else
a[4]=5;//=aa[4]
}

if(a[3]>5)...{
if(a[3]%2==0)
a[3]=4;//aa[3]=
else
a[3]=5;//aa[3]=
}

if(a[2]>4)...{
if(a[2]%2==0)
a[2]=4;//aa[2]=
else
a[2]=3;//aa[2]=
}

if(a[1]>7)...{
if(a[1]%2==0)
a[1]=6;//aa[1]=
else
a[1]=7;//aa[1]=
}
//for(i=1;i<=6;i++)aa[i]=a[i];
sum=0;
for(i=1;i<=6;i++)sum+=a[i]*i;

if(sum%2==1)...{
printf("Collection #%d: Can't be divided. ",n);
n++;
scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
continue;
}
sum/=2; j=1;
n1=0;
for(i=1;i<=6;i++)...{
n1+=a[i];
}

for(len=1;len<=n1/2;len++)...{
//for(i=1;i<=6;i++)a[i]=aa[i];//
nowLen=1;
ok=0;
for(i=1;i<=6;i++)...{
if(a[i]>0 )...{
a[i]--;
sum2=val=i; 
if(DFS(nowLen,sum2,val))...{
ok=1;
printf("Collection #%d: Can be divided. ",n);
break;
}
a[i]++;
}
}
if(ok)
break;
}
if(0==ok)
printf("Collection #%d: Can't be divided. ",n);
n++;
scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
}
return 0;
}

本文介绍了一个基于深度优先搜索算法解决背包问题的实例。通过定义数组记录不同物品的数量,并利用递归函数实现组合可能性的探索,判断是否能将给定数量的物品分为两组,使得两组的价值总和相等。
520

被折叠的 条评论
为什么被折叠?



