AcWing 1226. 包子凑数
考察:完全背包dp
思路:
写这道题需要有前置知识: 已知互质的数a与b,最大的不能由它们表示的数是(a-1)*(b-1)-1.
现在新加入数字c,不能表示的范围应该变小,因为>(a-1)*(b-1)-1的数都能被表示. 现在给出n个正整数,那么最大的不能由它们表示的数<10000.
确定上界后就简单了,假设给的数字是物品,体积是它们的值.那么f[i][j]表示的是前i个数j是否能被表示.之后直接套模板
注意:如果 a[1] a[2]...a[n]不互质的话,那么范围无限大.此时输出INF
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 const int N = 10010,M = 110; 6 int a[M]; 7 bool f[N]; 8 int gcd(int a,int b) 9 { 10 return b?gcd(b,a%b):a; 11 } 12 int main() 13 { 14 int n,ans = 0,d = 0; 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++) scanf("%d",&a[i]), d= gcd(a[i],d); 17 if(d>1) { puts("INF"); return 0; } 18 f[0] = 1; 19 for(int i=1;i<=n;i++) 20 for(int j=a[i];j<=10000;j++) 21 { 22 f[j] = f[j]|f[j-a[i]]; 23 } 24 for(int i=1;i<=10000;i++) if(!f[i]) ans++; 25 printf("%d\n",ans); 26 return 0; 27 }