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 }

猜你喜欢

转载自www.cnblogs.com/xunzf0402/p/11649934.html
今日推荐