1076: 饭卡
0-1 背包问题
#include <bits/stdc++.h>
using namespace std;
int n;
const int N=1010;
int price[N];
int dp[N];
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
scanf("%d",&price[i]);
}
int ba=0;
scanf("%d",&ba);
sort(price+1,price+n+1);
if(ba<5){
printf("%d\n",ba);
continue;
}
ba-=5;
price[n]-=5;
for(int i=1;i<=n-1;i++){ //代表我处理了前i颗菜
for(int j=ba;j>=price[i];j--){ //代表我在处理前i颗菜,我给了j块钱
// //dp[i][j]
// if(j<price[i])dp[i][j]=dp[i-1][j];
// else{
dp[j]=max(dp[j],dp[j-price[i]]+price[i]);
// }
}
}
printf("%d\n",ba-dp[ba]-price[n]);
}
return 0;
}

浙公网安备 33010602011771号