//=============================================================================== // //> 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 发布