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 }