hdu2546(01背包变形)

来源:互联网 发布:windows驱动开发 编辑:程序博客网 时间:2024/05/10 22:33

01背包变形

根据情况变形,由题意知,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包问题了

状态方程

 dp[j]=max(dp[j],dp[j-vo[i]+vo[i])

#include<iostream>#include <cstring>#include <algorithm>using namespace std;int vo[1005];int dp[1005];int main(){    int n,v;    while(cin>>n&&n)    {        for(int i=1;i<=n;i++)            cin>>vo[i];            cin>>v;        memset(dp,0,sizeof(dp));        sort(vo+1,vo+n+1);//wa==>(vo,vo+n)        int maxn=vo[n];        if(v<5)            cout<<v<<endl;        else{                v=v-5;        for(int i=1;i<n;i++)        {            for(int j=v;j>=vo[i];j--)            {                if(dp[j]<dp[j-vo[i]]+vo[i])//或者用dp[j]=max(dp[j],dp[j-vo[i]+vo[i])                dp[j]=dp[j-vo[i]]+vo[i];            }        }        cout<<v+5-dp[v]-maxn<<endl;        }    }    return 0;}


0 0
原创粉丝点击