hdu 1059&&POJ 1014 Dividing
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059,http://poj.org/problem?id=1014
题目大意:有六种石头,价值分别为1~6,给出每种石头的个数,问能否分成价值相等的两份。
题目分析:多重背包水无坑。
code:
#include<cstdio>
#include<cstring>
int main()
{
int i,j,k,a[7],t=0,sum;
bool dp[120020];
while(scanf("%d",a+1)!=EOF)
{
sum=*(a+1);
for(i=2;i<7;i++)
{
scanf("%d",a+i);
sum+=*(a+i)*i;
}
if(!sum)break;
memset(dp,false,sizeof(dp));
if(sum%2)
{
printf("Collection #%d:\nCan't be divided.\n\n",++t);
continue;
}
dp[0]=1;
for(i=1;i<7;i++)
{
for(j=1;a[i]>j;j*=2)
{//j*=2与j<<=1一致,与j<<1不同
for(k=sum/2;k>=i*j;k--)
{
if(dp[k-i*j])dp[k]=true;
}
a[i]-=j;
}
for(k=sum/2;k>=i*a[i];k--)
{
if(dp[k-i*a[i]])dp[k]=true;
}
}
printf("Collection #%d:\n%s be divided.\n\n",++t,dp[sum/2]?"Can":"Can't");
}
return 0;
}
PS:坑啊……一开始把注释处j*=2写成j<<1,果断TLE,其实j<<=1也对,有等号才有赋值。另外格式也要注意。