hdu 2546 饭卡 (01背包)

Posted kls123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
}

 

以上是关于hdu 2546 饭卡 (01背包)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2546 饭卡(01背包)

(01背包 排序+特判)饭卡(hdu 2546)

HDU 2546 饭卡(01背包裸题)

hdu2546 饭卡 01-背包问题

hdu 2546 饭卡 01背包

hdu 2546 饭卡 (01背包)