HDU 2546 簡單的01揹包

一個簡單的01揹包變種

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    #endif // LOCAL
    int N;
    while(scanf("%d",&N))
    {
        if(N == 0)break;
        int P[N],M;
        for(int i = 0; i < N; i++)
            scanf("%d",&P[i]);//N種菜的價格
        sort(P,P+N);//排序  把價值最大的放在最後
        int sum = 0;
        for(int i = 0; i < N; i++)
            sum += P[i];
        scanf("%d",&M);
        if(M < 5)
            printf("%d\n",M);
        else if(M - sum >= 5)
            printf("%d\n", M - sum);
            else
            {
                int dp[M];
                memset(dp,0,sizeof(dp));
                for(int i = 0 ; i < N - 1 ;i++)//留下一個最大的
                {
                    for(int p = M - 5;p >= P[i];p--)
                    dp[p] = max(dp[p],dp[p - P[i]]+P[i]);
                }
                printf("%d\n",M-dp[M-5]-P[N-1]);
            }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章