先将前n-1个从小到大排序。对m-5进行01背包。然后答案就是m-dp[m-5]-a[n-1]
至于为什么最后减去最贵的菜品,而不是把最贵的菜品也放到01背包里呢,
由于假设能够把最贵菜品a[n-1]能够放到背包里。那么其它菜品a[i]也一定能够放在背包里(背包的容量为m-5),最后都是减去a[i]+a[n-1],所以能够吧最贵的菜品不放入背包,直接最后减去
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; #define N 1005 int a[N],dp[N]; int main(){ int n,m; while(cin>>n,n){ for(int i=0;i<n;i++){ scanf("%d",&a[i]); } cin>>m; int s=m-5; if(s<0){ printf("%d ",m); continue; } sort(a,a+n); for(int i=0;i<=m;i++) dp[i]=0; for(int i=0;i<n-1;i++){ for(int j=s;j>=a[i];j--) dp[j]=max(dp[j-a[i]]+a[i],dp[j]); } printf("%d ",m-dp[s]-a[n-1]); } }