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;
}
posted @ 2026-03-11 22:41  peter_shen  阅读(12)  评论(0)    收藏  举报