题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546
题目大意:中文题目
解题思路:题目说当余额大于等于5的时候可以买任意贵的菜,因此每次应该先留出5元,用它来买最贵的菜,剩下的钱就是背包的总容量了,利用01背包解决。
AC代码:
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int n;
int price[1005];
int dp[1005];
int m;
while(cin>>n)
{
if(n==0)break;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
cin>>price[i];
}
sort(price+1,price+1+n);
// for(int i=1;i<=n;i++)cout<<price[i]<<endl;
int max = price[n];//cout<<"max"<<max<<endl;
cin>>m;
if(m<5)
{
cout<<m<<endl;
continue;
}
m-=5;
for(int i=1;i<n;i++)
{
for(int j=m;j>=price[i];j--)
{
if(dp[j-price[i]]+price[i]>dp[j])
dp[j] = dp[j-price[i]]+price[i];
}
}
cout<<m+5-dp[m]-max<<endl;
}
return 0;
}
调试完的时候一定要记得把调试代码注释掉啊………………因为这个WA了一次,醉了