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 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。