Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19646 Accepted Submission(s): 5534
#include
#include
#include
#define MAX 20000+10
using namespace std;
int val[MAX];//记录物品i的价值
int dp[60000+10];
int main()
{
int num[7];
int sum;//统计总价值
int i, j, k;
int p = 1;
while(scanf("%d%d%d%d%d%d", &num[1], &num[2], &num[3], &num[4], &num[5], &num[6]) != EOF)
{
if(num[1] == 0 && num[2] == 0 && num[3] == 0 && num[4] == 0 && num[5] == 0 && num[6] == 0)
return 0;
k = 0;//记录物品数目
sum = 0;//记录总价值
for(i = 1; i <= 6; i++)//价值
{
sum += num[i] * i;
for(j = 1; j <= num[i]; j <<= 1)//二进制拆分物品
{
val[k++] = j * i;//系数乘以价值
num[i] -= j;//减去当前系数
}
if(num[i] > 0)//如果不能正好均分
val[k++] = num[i] * i;//当前剩余系数乘以价值
}
if(sum & 1)
{
printf("Collection #%d:\n", p++);
printf("Can't be divided.\n\n");
continue;
}
memset(dp, 0, sizeof(dp));
sum /= 2;//一半价值
for(i = 0; i < k; i++)//01背包
{
for(j = sum; j >= val[i]; j--)
{
dp[j] = max(dp[j], dp[j-val[i]] + val[i]);
}
}
printf("Collection #%d:\n", p++);
if(dp[sum] == sum)//可以装满一半背包
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}
#include
#include
#include
#define MAX 210000+10
using namespace std;
int c1[MAX], c2[MAX];
int main()
{
int num[7];
int sum;//统计总价值
int use, k, i, j;
int p = 1;
while(scanf("%d%d%d%d%d%d", &num[1], &num[2], &num[3], &num[4], &num[5], &num[6]) != EOF)
{
if(num[1] == 0 && num[2] == 0 && num[3] == 0 && num[4] == 0 && num[5] == 0 && num[6] == 0)
return 0;
for(i = 1, sum = 0; i <= 6; i++)
{
sum += (num[i] * i) % 60;//费解。。。
}
if(sum & 1)
{
printf("Collection #%d:\n", p++);
printf("Can't be divided.\n\n");
continue;
}
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for(i = 0; i <= num[1]; i++)
c1[i] = 1;
for(i = 2; i <= 6; i++)
{
if(num[i] == 0) continue;//没有对应价值的 不用进行下面的运算
for(j = 0; j <= sum/2; j++)
{
for(k = 0, use = 0; k+j <= sum/2 && use <= num[i]; k += i, use++)
{
c2[k+j] += c1[j];
}
}
for(j = 0; j <= sum/2; j++)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
printf("Collection #%d:\n", p++);
if(c1[sum/2])//可以匹配到 一半
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}