POJ 1276 (多重背包) Cash Machine

题意:

有n种纸币,已知每种纸币的面值和数量,求所能凑成的不超过cash的最大总面值。

分析:

这道题自己写了一下TLE了,好可耻。。

找了份比较简洁的代码抄过来了。。poj1276

 1 #include <cstdio>

 2 #include <cstring>

 3 

 4 const int maxn = 12;

 5 const int maxp = 100000 + 10;

 6 

 7 bool vis[maxp];//是否到达总面值i

 8 int used[maxp];//到达总面值i时,该种纸币所用的数量

 9 int a[maxn], b[maxn];//每种纸币的数量以及面值

10 

11 int cash, n;

12 

13 int main()

14 {

15     //freopen("in.txt", "r", stdin);

16 

17     while(scanf("%d", &cash) == 1)

18     {

19         scanf("%d", &n);

20         for(int i = 0; i < n; ++i) scanf("%d%d", &a[i], &b[i]);

21 

22         memset(vis, false, sizeof(vis));

23         vis[0] = true;

24         for(int i = 0; i < n; ++i)

25         {

26             memset(used, 0, sizeof(used));

27             for(int j = b[i]; j <= cash; ++j)

28                 if(vis[j-b[i]] && !vis[j] && used[j-b[i]] < a[i])

29                 { vis[j] = true; used[j] = used[j-b[i]] + 1; }

30         }

31 

32         for(int i = cash; i >= 0; --i) if(vis[i]) { printf("%d\n", i); break; }

33     }

34 

35     return 0;

36 }
代码君

 

你可能感兴趣的:(mac)