HDU 2546 - 饭卡

来源:互联网 发布:rc补偿网络 编辑:程序博客网 时间:2024/05/22 00:47

这题想了一下午~

没构造出来后来搜了一下,发现需要先减掉5元拿最贵的菜,再用01背包即可。。。弱爆了。

#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <iostream>#include <set>#include <map>#include <queue>#include <stack>#include <assert.h>#include <malloc.h>typedef long long LL;using namespace std;int dp[1003][1003];int main(){    //freopen("test0.in", "r", stdin);    //freopen("test0.out", "w", stdout);    int n, m, v[1001];    while(scanf("%d", &n), n)    {        for(int i = 1; i <= n; i++)        {            scanf("%d", &v[i]);        }        scanf("%d", &m);        if(m < 5)        {            printf("%d\n", m);            continue;        }        sort(v+1, v+n+1);        memset(dp, 0, sizeof(dp));        int ans = 0;        if(m >= 5)        {            ans = v[n--];            m -= 5;        }        for(int i = 1; i <= n; i++)        {            for(int C = m; C >= 0; C--)            {                dp[C][i] = dp[C][i-1];                if(C >= v[i])                {                    dp[C][i] = max(dp[C][i], dp[C-v[i]][i-1]+v[i]);                }            }        }        if(ans)        {            printf("%d\n", m + 5 - ans - dp[m][n]);        }        else        {            printf("%d\n", m-ans-dp[m][n]);        }    }    return 0;}


0 0