HDU 2546 01背包

Posted xunzf0402

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2546 01背包相关的知识,希望对你有一定的参考价值。

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2546

题意:余额在5元以上可以任意消费,一次一结,问最小余额。

思路:先用5元买最贵的,再找消费最多的,01背包问题。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 typedef long long ll;
 8 
 9 int n,m;
10 int w[1055];
11 int dp[1055];
12 
13 void sol(){
14     memset(dp,0,sizeof(dp));    //一开始少了这个找了好久的错
15     for(int i=1;i<=n;i++)
16         cin>>w[i];
17     cin>>m;
18 
19     if(m<5){
20         cout<<m<<endl;
21         return ;
22     }
23 
24     sort(w+1,w+n+1);
25     m-=5;
26 
27     for(int i=1;i<n;i++)
28         for(int j=m;j>=w[i];j--)
29             dp[j]=max( dp[j],dp[j-w[i]]+w[i] );
30     cout<<m+5-dp[m]-w[n]<<endl;
31 }
32 int main(){
33     while(cin>>n,n) sol();
34     return 0;
35 }

 

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

HDU 2546 饭卡(01背包)

HDU 2546 01背包问题

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

hdu2546 01背包

HDU2546(01背包)

HDU 2546 饭卡(01背包)