历届试题 包子凑数

完全背包问题,先判所有数的Gcd是否为1,如果不是1的话,显然他们能凑出的数一定是Gcd的倍数,所以一定有无穷个凑不出来,然后两个for解决。

Code:

#include <bits/stdc++.h>
using namespace std;
int dp[10005];
int a[105];
int gcd(int a, int b)
{
	return b == 0 ? a : gcd(b, a%b);
}
int main()
{
	int n, f = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
		if (i == 0)
			f = a[i];
		else
			f = gcd(f, a[i]);
	}
	if (f != 1)
	{
		puts("INF");
		return 0;
	}
	dp[0] = 1;
	for (int i = 0; i < n; i++)
	{
		for (int j = a[i]; j < 10005; j++)
			dp[j] = max(dp[j], dp[j - a[i]]);
	}
	int cnt = 0;
	for (int i = 1; i < 10005; i++)
		if (!dp[i])
			cnt++;
	printf("%d", cnt);
}

 

全部评论

相关推荐

今天 11:21
门头沟学院 Java
总包48.5w,意想不到的价格
无情咸鱼王的秋招日记之薛定谔的Offer:R
点赞 评论 收藏
分享
11-15 19:28
已编辑
蚌埠坦克学院 硬件开发
点赞 评论 收藏
分享
没有offer的小土豆:专业面试一般是分配面试官然后联系你面试 应该是还没给你分配对应面试官
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务