题目地址: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 }