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

 

你可能感兴趣的:(mac)