1. 程式人生 > >HDU 2546——揹包dp

HDU 2546——揹包dp

一道很常規的揹包dp,不過要考慮幾個細節:最後5塊錢的話什麼都可以買,所以最後五塊錢肯定要買最大值的菜價,然後對於m-5的錢,就是裸揹包問題了,直接上01揹包模板就行。

程式碼:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1005;
int dp[maxn][maxn];//前i個菜選j個的最大收益
int a[maxn];//菜價格
const int INF=0x3f3f3f3f;
int main()
{
    int n,m;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        scanf("%d",&m);
        if(m<5)
        {
            printf("%d\n",m);
            continue;
        }
        for(int i=0;i<=m;i++)
        {
            dp[0][i]=0;
        }
        sort(a+1,a+n+1);
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<=m-5;j++)
            {
                dp[i][j]=dp[i-1][j];
                if(j>=a[i])
                    dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+a[i]);
            }
        }
        printf("%d\n",m-dp[n-1][m-5]-a[n]);//留最後的五塊錢買最大的
    }
    return 0;
}