裴蜀定理
裴蜀定理:任意两个数来组合,必定是其gcd的倍数。
推广:如果求n个数的组合结果集,如果这n个数的gcd不为1,则有无穷个数无法被组合。
gcd=1时,两个数最大不能表示的数是(a-1)(b-1)-1;
本题的状态方程和完全背包模板题类似,不过求max变成了 || 。
dp状态表示的是前i类笼子是否能组合出数字 j。
https://www.acwing.com/problem/content/1228/
#include
using namespace std;
const int N=110;
bool f[N][10005];
int n;
int w[N];
int gcd(int a ,int b){
return b ? gcd(b,a%b) : a;
}
int main(){
int d;
cin>>n;
for (int i = 1; i <=n; i ++ ) cin>>w[i];
for(int i=1;i<=n;i++){
d=gcd(d,w[i]);
}
if(d!=1) {puts("INF");return 0;}
f[0][0]=true;
for(int i=1;i<=n;i++){
for(int j=0;j<10000;j++){
if(j>=w[i]) f[i][j]=f[i-1][j] || f[i][j-w[i]];
else f[i][j]=f[i-1][j];
}
}
int ans=0;
for(int j=0;j<10000;j++){
if(!f[n][j]) ans++;
}
cout<