HDU 2546 饭卡 (基础01背包)

【题目链接】:click here~~

【思路】要使卡能能买到商品,不如先计算余额减去5之后能买前n-1个商品的最大价值(前提按照价格递增排序),最后减去最大的价格即可

代码:

/*
* Problem: HDU No.2546
* Running time: 46MS
* Complier: C++
* Author: javaherongwei
* Create Time: 11:26 2015/9/5 星期六
*/

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
const int N=1005;
int dp[N];
int value[N],volume[N];
int n,V;
int main()
{
    while(scanf("%d",&n),n)
    {
        memset(dp,0,sizeof(dp));
        memset(value,0,sizeof(value));
        memset(volume,0,sizeof(volume));
        int maxx=0;
        for(int i=0; i<n; ++i)
        {
            scanf("%d",&volume[i]);
            maxx=max(volume[i],maxx);
        }
        scanf("%d",&V);
        sort(volume,volume+n);
        if(V>=5)
        {
            for(int i=0; i<n-1; ++i)
            {
                for(int v=V-5; v>=volume[i]; --v)
                {
                    dp[v]=max(dp[v],dp[v-volume[i]]+volume[i]);
                }
            }
            printf("%d\n",V-dp[V-5]-volume[n-1]);
        }
        else printf("%d\n",V);
    }
    return 0;
}

/*
Sample Input
1
50
5
10
1 2 3 2 1 1 2 3 2 1
50
0

Sample Output
-45
32
*/


你可能感兴趣的:(dp,HDU,01背包)