题目大意就是给定六个石头的价值然后给定每个石头的数目,让你求如何将石头分成两份等值;注意单块石头不能被分开;可以类比01背包问题
#include <stdlib.h>
#include <stdio.h>#include <string.h>
#define MAX 70010
int dp[2*MAX];
int a[10];
int inline max(int a,int b)
{
if(a>b) return a;
else return b;
}
int solve(int n,int v)
{
int i,j,k,amount;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
if(a[i]*i>=v)//完全背包
{
for(j=i;j<=v;j++)
dp[j]=max(dp[j],dp[j-i]+i);
}
else//01背包
{
k=1;
amount=a[i];
while(k<amount)
{
for(j=v;j>=k*i;j--)
dp[j]=max(dp[j],dp[j-k*i]+k*i);
amount-=k;
k*=2;
}
for(j=v;j>=amount*i;j--)
dp[j]=max(dp[j],dp[j-amount*i]+amount*i);
}
}
return dp[v];
}
int main()
{
int cas=0,flag,i,sum;
while(1)
{
cas++;
sum=0;
for(i=1;i<=6;i++)
{
scanf("%d",&a[i]);
sum+=a[i]*i;
}
flag=0;
for(i=1;i<7;i++)
{
if(a[i]!=0)
{
flag=1;
break;
}
}
if(flag==0)
{
break;
}
if(sum%2==1)
{
printf("Collection #%d:\nCan't be divided.\n\n",cas);
continue;
}
i=solve(6,sum/2);
if(i==(sum/2))
printf("Collection #%d:\nCan be divided.\n\n",cas);
else
printf("Collection #%d:\nCan't be divided.\n\n",cas);
}
return 0;
}