試題 算法訓練 最大體積
資源限制
時間限制: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;
}