//===============================================================================
//
//> Author : flowertree
//> About : poj 1742
//> Time : 2015.12.28
//> Algorithm : 多重背包 楼天成男人八题
// : 完全背包转换为 01背包 多重背包转换为 完全背包
//
//===============================================================================
#include <iostream>
#include <string.h>
using namespace std;
#define MAX 110000
#define M 7
int w[M] = {0, 1, 2, 3, 4, 5, 6};
int num[M], tempnum[MAX];
bool flag[MAX];
int main()
{
int Case = 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)
break;
int sum = 0;
for(int i = 1; i <= 6; i++)
sum += w[i] * num[i];
if(sum & 1)
{
printf("Collection #%d:\nCan't be divided.\n\n", Case++);
continue;
}
sum /= 2;
memset(flag, false, sizeof(flag));
flag[0] = true;
bool mark = false;
for(int i = 1; i <= 6 && (!mark); i++) //在完全背包基础上扩充几点,tempnum存储当前空间内使用第i个物品的数量
{
memset(tempnum, 0, sizeof(tempnum));
for(int v = w[i]; v <= MAX && (!mark); v++)
{
if(flag[v - w[i]] && (tempnum[v - w[i]] < num[i]) && (!flag[v]))
{
tempnum[v] = tempnum[v - w[i]] + 1;
flag[v] = true;
if(v == sum)
mark = true;
}
}
}
printf("Collection #%d:\n", Case++);
if(mark)
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
system("pause");
return 0;
}
poj 1014 动态规划多重背包
最新推荐文章于 2021-08-26 12:59:36 发布