【题解】P1537
大致思路
首先,我们要转化问题,假设弹珠总价值为 \(sum\),那么背包的容积则为 \(sum \div 2\) 让你求给的这些弹珠是否恰好有一种选法能填满这个背包。但不过数据较水,朴素的多重背包也能过。
Code
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 10005;
int n = 6, cnt;
int a[MAXN];
int f[MAXN];
int main() {
while (1) {
memset(f, 0, sizeof(f));
int flag = 0, sum = 0; //flag判断是否结束,sum为价值和
for (int i = 1; i <= 6; i++)
scanf("%d", &a[i]), flag |= a[i], sum += a[i] * i;
if (!flag)
break;
cnt++;
if (sum & 1) { //无解的特判
printf("Collection #%d:\nCan't be divided.\n", cnt);
puts("");
continue;
}
f[0] = 1;
for (int i = 1; i <= n; i++) { //多重背包
for (int j = 1; j <= a[i]; j++)
for (int k = sum / 2; k >= i * j; k--)
f[k] |= f[k - i * j];
}
if (!f[sum / 2])
printf("Collection #%d:\nCan't be divided.\n", cnt);
else
printf("Collection #%d:\nCan be divided.\n", cnt);
puts("");
}
return 0;
}
本文来自博客园,作者:zhou_ziyi,转载请注明原文链接:https://www.cnblogs.com/zhouziyi/p/16526578.html

浙公网安备 33010602011771号