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;
}