蓝桥杯 包子凑数
1.思路 :
定理:如果N个数的最大公约数不为1,则有无穷个,否则都是有限个,再利用到动态规划思想;
2.代码
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define ll long long
using namespace std;
int gcd(int a,int b) {//算最大公约数
if(b==0) return a;
return gcd(b,a%b);
}
int main() {
int N,a[101];
int top=20010;//开10000只有62分,有三个案例过不了
int dp[top]= {0};
cin>>N;
for(int i=0; i<N; i++)
cin>>a[i];
int gcdN=a[0];
for(int i=1; i<N; i++) {
gcdN=gcd(gcdN,a[i]);
}
if(gcdN!=1) {//N个数不互质,即最大公约数不为1,则有无穷个数表示不了
cout<<"INF"<<endl;
} else {
dp[0]=1;//0可以被凑出来
for(int i=0; i<N; i++) {
for(int j=0; j+a[i]<top; j++) {
if(dp[j]==1)//如果j可以 凑出来,则j+a[i]一定能凑出来
dp[j+a[i]]=1;//标记为1
}
}
int count=0;
for(int i=0; i<top; i++) {
if(dp[i]==0)//统计不能被凑出来的数量
count++;
}
cout<<count<<endl;
}
return 0;
}