您的当前位置:首页正文

蓝桥杯---最大体积---暴力背包

2024-11-20 来源:个人技术集锦

试题 算法训练 最大体积

资源限制

  时间限制:1.0s 内存限制:256.0MB

问题描述

  每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的OIER想要研究一下物品不能装出的最大体积。题目保证有解,如果是有限解,保证不超过2,000,000,000
  如果是无限解,则输出0

输入格式

  第一行一个整数n(n<=10),表示物品的件数
  第2行到N+1行: 每件物品的体积(1<= <=500)

输出格式

  一个整数ans,表示不能用这些物品得到的最大体积。

样例输入
样例输出

17

实现代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 1e5 + 5;

int a[11], bag[maxn], n;

int gcd(int a, int b) {
	if (a < b) swap(a, b);
	return !b ? a : gcd(b, a % b);
}

bool judge() {
	int flag = a[1], m = a[1];
	for (int i = 2; i <= n; i++) {
		flag = gcd(a[i], flag);
		m = min(m, a[i]);
	}
	return (flag == 1 && m != 1); // 如果最小的数字是0也返回false
}

int main() { 
	memset(bag, 0, sizeof(bag));
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	if (judge()) {
		bag[0] = 1;
		for (int i = 1; i <= n; i++) 
			for (int j = a[i]; j <= maxn; j++) 
				if (!bag[j] && bag[j - a[i]]) bag[j] = 1;
			
		for (int i = maxn; i >= 0; i--) {
			if (!bag[i]) {
				cout << i << endl;
				return 0;
			}
		}
	}
	else cout << 0 << endl;
	return 0;
}
显示全文