HDU1059Dividing
题意&思路:
给你质量为1~6的宝石的个数,问能不能等分。
对于总质量为奇数的肯定不能等分,对于质量为偶数的,只要dp[m]==m(m=sum/2)就可以等分,这样就是多重背包问题了。坑点是输出格式,要两个换行。
代码:
#include<bits/stdc++.h>
const int N=1e5+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
int a[7],dp[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int sum,i,j,k,t=0;
while(1)
{
sum=0;
t++;
memset(dp,0,sizeof(dp));
for(i=1;i<=6;i++)
{
cin>>a[i];
sum=sum+a[i]*i;
}
if(sum==0)
break;
else if(sum%2==1)
{
printf("Collection #%d:\nCan't be divided.\n\n",t);
continue;
}
else
{
int m=sum/2;
for(i=1;i<=6;i++)
{
int num=min(a[i],m/i);
for(j=1;num>0;j<<=1)
{
if(j>num)
j=num;
num-=j;
for(k=m;k>=j*i;k--)
dp[k]=max(dp[k],dp[k-j*i]+j*i);
}
}
if(dp[m]==m)
printf("Collection #%d:\nCan be divided.\n\n",t);
else
printf("Collection #%d:\nCan't be divided.\n\n",t);
}
}
return 0;
}