思路:先拿5元出来把最贵的买了,剩下的钱用01背包算可以买啥
wa的点:
1.又忘记初始化dp数组了。。。
2.考虑当余额小于5的时候啥也买不了 输出m即可 手贱输出了5.。。。
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[5001];
int main(){
int n, m;
while(cin >> n){
if(n <= 0) break;
int price[n];
for(int i = 0; i < n; i++){
cin >> price[i];
}
sort(price , price+n);
cin >> m;
if(m < 5) {cout << m <<endl; continue;}
int left = m - 5;
int dd = 5 - price[n-1];
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n-1; i++){
for(int j = left; j >= price[i]; j--){
dp[j] = max(dp[j], dp[j-price[i]] + price[i]);
}
}
cout << left - dp[left] + dd << endl;
}
return 0;
}