hdu 2546 饭卡 (01背包)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546

思路:如果剩余金额大于五可以任意取,那么肯定是优先把金额最大的最后取,以金额m-5为容量 进行01背包,求得的最大金额加上最后取的物品,就是花费最大的。另外还有一个特殊情况当m<5时,此时什么物品都无法取直接输出m就好了

 

实现代码;

#include<bits/stdc++.h>
using namespace std;
const int M = 1e3+10;
int a[M],dp[M];
int main()
{
    int n,m;
    while(cin>>n){
        if(n == 0) break;
        memset(dp,0,sizeof(dp));
        for(int i = 1;i <= n;i ++){
            cin>>a[i];
        }
        sort(a+1,a+1+n);
        cin>>m;
        if(m < 5){
            cout<<m<<endl; continue;
        }
        for(int i = 1;i < n;i ++){
            for(int j = m-5;j >= a[i];j --)
                dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
        }
        int ans = m - dp[m-5] - a[n];
        cout<<ans<<endl;
    }
}

 

posted @ 2019-04-09 19:33  冥想选手  阅读(152)  评论(0编辑  收藏  举报