1. 程式人生 > >2546 飯卡(01揹包,挺好的)

2546 飯卡(01揹包,挺好的)

題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2546

思路:剛開始直接把揹包的容量搞為m-5+max1(max1的值為最貴的菜的價格),因為他最多的能花這麼多,結果錯了,應該把最大的單獨提出來,用5塊來買,剩下的錢做揹包

AC程式碼:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int dp[1000];
int a[1010];
int main()
{
    int n;
    while(scanf("%d",&n) && n)
    {
        memset(dp,0,sizeof(dp));
        int max1 = -1;
        int k;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            if(a[i] > max1)
            {
                max1 = a[i];
                k = i;
            }
        }
        int x;
        scanf("%d",&x);
        if(x < 5)
        {
            printf("%d\n",x);
            continue;
        }
        x -= 5;
        for(int i=1; i<=n; i++)
        {
            if(i == k)
                continue;
            for(int j=x; j>=a[i]; j--)
            {
                dp[j] = max(dp[j],dp[j-a[i]] + a[i]);
            }
        }
        printf("%d\n",x+5-dp[x]-max1);
    }
    return 0;
}

錯誤程式碼:(這個會造成價值最大的有可能沒有選,邏輯不對)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int dp[1060];
int a[1010];
int main()
{
    int n;
    while(scanf("%d",&n) && n)
    {
        memset(dp,0,sizeof(dp));
        int max1 = 0;
        for(int i=1; i<=n; i++)
        {
             scanf("%d",&a[i]);
             if(a[i] > max1)
                max1 = a[i];
        }
        int cost;
        scanf("%d",&cost);
        int x = cost;
        if(cost < 5)
        {
            printf("%d\n",cost);
            continue;
        }
        cost = cost - 5 + max1;
        for(int i=1; i<=n; i++)
        {
            for(int j=cost; j>=a[i]; j--)
            {
                dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
            }
        }
        printf("%d\n",x-dp[cost]);
    }
    return 0;
}