【题解】P1537

大致思路

首先,我们要转化问题,假设弹珠总价值为 sum,那么背包的容积则为 sum÷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;
}
posted @   zhou_ziyi  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示