码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2546 饭卡 (01背包)

时间:2019-04-09 20:37:34      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:using   背包   特殊情况   pre   out   ace   ++   bre   continue   

链接: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背包)

标签:using   背包   特殊情况   pre   out   ace   ++   bre   continue   

原文地址:https://www.cnblogs.com/kls123/p/10679149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!