#include<bits/stdc++.h>
using namespace std;
int N, A[110];
//两个互质的数a,b 最大不能组合数为a*b-a-b
bool dp[10000]={false}; //dp[i]表示i可不可以被凑出
//辗转相除法,求最大公约数
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
int main(void)
{
int ans=0;
scanf("%d",&N);
dp[0]=true;
for(int i=0; i<N; i++)
{
scanf("%d",&A[i]);
//递推,完全背包
for(int j=0; j<=10000; j++)
if(dp[j]==true)
dp[j+A[i]]=true;
}
int a=A[0];
for(int i=1; i<N; i++)
a=gcd(a,A[i]);
if(a!=1)
{
printf("INF");
return 0;
}
for(int i=0; i<10000; i++)
{
if(dp[i]==false)
{
ans++;
printf("%d ",i);
}
}
printf("\n%d",ans);
return 0;
}
《程序设计实践》——包子凑数
最新推荐文章于 2024-03-14 20:28:57 发布