题目描述
每个物品有一定的体积(废话),不同的物品组合,装入背包会占用一定的总体积。
假如每个物品有无限件可用,那么有些体积是永远也装不出来的。
为了尽量装满背包,附中的OIER想要研究一下物品不能装出的最大体积。
题目保证有解,如果是有限解,保证不超过 2 × 109,如果是无限解,则输出 0。
输入格式
第一行一个整数 n,表示物品的件数
第 2 行到 n + 1 行,表示每件物品的体积
输出格式
一个整数,表示不能用这些物品得到的最大体积。
样例输入
3
3
6
10
样例输出
17
数据范围
1 ≤ n ≤ 10
1 ≤ 物品体积 ≤ 500
题解
完全背包 & 数学:
结论
:如果所有物品的最大公约数不是 1
,那么凑不出来的数字一定无限多。
#include <iostream>
using namespace std;
int w[10], f[100010];
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int n;
cin >> n;
int d = 0;
for (int i = 1; i <= n; i ++)
{
cin >> w[i];
d = gcd(d, w[i]);
}
if (d == 1)
{
f[0] = 1;
for (int i = 1; i <= n; i ++)
for (int j = w[i]; j <= 100010; j ++)
f[j] |= f[j - w[i]];
for (int i = 100010; i >= 0; i--)
if (!f[i])
{
cout << i << endl;
return 0;
}
}
cout << 0 << endl;
return 0;
}
ps:这题是15年更新的,却在17年的省赛中出现了😒