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 }

 

posted @ 2021-02-02 15:46  acmloser  阅读(83)  评论(0编辑  收藏  举报