【题解】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号
浙公网安备 33010602011771号