藍橋杯---最大體積---暴力揹包

試題 算法訓練 最大體積

資源限制

  時間限制:1.0s 內存限制:256.0MB

問題描述

  每個物品有一定的體積(廢話),不同的物品組合,裝入揹包會戰用一定的總體積。假如每個物品有無限件可用,那麼有些體積是永遠也裝不出來的。爲了儘量裝滿揹包,附中的OIER想要研究一下物品不能裝出的最大體積。題目保證有解,如果是有限解,保證不超過2,000,000,000
  如果是無限解,則輸出0

輸入格式

  第一行一個整數n(n<=10),表示物品的件數
  第2行到N+1行: 每件物品的體積(1<= <=500)

輸出格式

  一個整數ans,表示不能用這些物品得到的最大體積。

樣例輸入

3
3
6
10

樣例輸出

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章