POJ 1276 Cash Machine 多重背包

题目: http://poj.org/problem?id=1276

英语实在是硬伤啊,只好去看了下别人的翻译,题意就是说:用不同面值的钱凑出与给定的钱不超过且最接近的钱。

读完瞬间发现是楼教主的多重背包问题,第一次交上忘了一个判断,WA一次,第二次就A了,很轻松惬意。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 bool dp[1000000];
 4 int c[1000], w[1000];
 5 short cnt[1000000];
 6 int main()
 7 {
 8     int sum, n;
 9     while(scanf("%d %d", &sum, &n) != EOF)
10     {
11         for(int i = 0; i < n; i++)
12         {
13             scanf("%d %d", &c[i], &w[i]);
14         }
15         memset(dp, 0, sizeof(dp));
16         dp[0] = 1;
17         for(int i = 0; i < n; i++)
18         {
19             memset(cnt, 0, sizeof(cnt));
20             for(int j = w[i]; j <= sum; j++)
21             {
22                 //第一次忘了写!dp[j]了,WA一次。。
23                 if(!dp[j] && dp[j-w[i]] && cnt[j-w[i]] < c[i])
24                 {
25                     dp[j] = 1;
26                     cnt[j] = cnt[j-w[i]] + 1;
27                 }
28             }
29         }
30         int ans = sum;
31         while(!dp[ans])
32             ans--;
33         printf("%d\n", ans);
34     }
35     return 0;
36 }
View Code

 

posted @ 2013-08-22 21:13  Anti-Magic  阅读(220)  评论(0编辑  收藏  举报