首先分析有无限数的情况,肯定是存在有非1公约数的情况,这个直接排除,然后是dp数组,对于这种背包问题的变形,第一维肯定是进行到第几笼,第二维是包子数,dp[][]代表是否可以凑出来,而包子的上限((一笼包子数最大值-1)*(笼数最大值-1)-1)也是要死记的,不过这次直接取10000了,判断包子能不能凑,只有一种情况肯定不能,就是包子数小于此笼的包子数且上一笼也没有凑出来也不能不加这一笼,剩余情况取决于dp[i][j-当前笼的包子数]是否可行
include[HTML_REMOVED]
include[HTML_REMOVED]
using namespace std;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main(void){
int n;
cin >> n;
int a[300];
int d = 0;
for (int i = 1; i <= n; i) {
cin >> a[i];
d = gcd(d, a[i]);
}
bool dp[200][10001];
dp[0][0] = true;
if (d != 1) cout << “INF”;
else{
for (int i = 1; i <= n; i){
for (int j = 0; j <= 10000; ++j)
dp[i][j] = dp[i - 1][j] || (j >= a[i] ? dp[i][j - a[i]] : false);
}
int ans = 0;
for (int j = 0; j <= 10000; ++j)
if (!dp[n][j]) ans++;
cout << ans;
}
return 0;
}