http://acm.hdu.edu.cn/showproblem.php?pid=2546
(1) 简单的01背包问题,但是只要有5元钱就可以买菜,不论菜多贵(但是才只能一样一样地买)。所以预留5元钱买最贵的菜。
(2)排序时用到了:
sort(a, a+n);
但是对于我的解法而言,应当是:
sort(a+1, a+n+1);
(3)有再循环里头用过一个 if-else 结构,并没有用贪心策略,AC了。可是代码丢了,也忘了时怎么写的。。
(4)钱不够5元的直接输出结果。
View Code
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n, m; int a[1010]; int dp[1010]; int main() { int i, j; while(scanf("%d", &n)!=EOF, n) { for(i=1;i<=n;i++) scanf("%d", &a[i]); sort(a+1, a+n+1); scanf("%d", &m); if(m<5) {printf("%d\n", m); continue;} memset(dp, 0, sizeof(dp)); int tm=m-5; for(i=1;i<n;i++) for(j=tm;j>=a[i];j--) dp[j]=max(dp[j], dp[j-a[i]]+a[i]); printf("%d\n", m-dp[tm]-a[n]); } return 0; }
