我的做法是找出n种菜中最贵的价格k,把背包的容量m增加的到m+k
然后对价格排个序,因为DP是从第一个菜到最后一个菜,越贵的菜越后选结果越小,然后进行DP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <memory.h>
using namespace std;
const int maxn=1010;
int w[maxn],dp[maxn][maxn],n,m;
int main(){
while (scanf("%d",&n)&&n){
int mv=0;
for (int i=1;i<=n;++i){
scanf("%d",&w[i]);
mv=max(mv,w[i]);
}
sort(w+1,w+n+1);
scanf("%d",&m);
memset(dp,0,sizeof(dp));
int ans=m;
if(m>=5)
for (int i=1;i<=n;++i){
for (int j=0;j<=m+mv;++j){
if(j-w[i]>=5&&j-w[i]<=m){//余额必须大于等于5并且j-w[i]要小于等于初始价格m,也就是从m之内拓展出来的最大值.
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+w[i]);
ans=min(ans,m-dp[i][j]);
}else{
dp[i][j]=dp[i-1][j];
}
}
}
printf("%d\n",ans);
}
return 0;
}