Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 52979 Accepted Submission(s): 17963
题解:01背包。如果m<5,则不能再买菜,直接输出m。如果m>=5,则求(m-5)在除了最贵的菜上进行01背包,最后再加上(m-最贵的菜)。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1500;
int w[maxn];
int main()
{
int i,j,n,m;
while(~scanf("%d",&n)&&n)
{
int dp[maxn]={0};
for(i=1;i<=n;i++) scanf("%d",&w[i]);
sort(w+1,w+n+1);
scanf("%d",&m);
if(m<5) {printf("%d\n",m);continue;}
for(i=1;i<n;i++)
{
for(j=m-5;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
}
printf("%d\n",m-dp[m-5]-w[n]);// m-5-dp[m-5]+5-w[n]
}
return 0;
}
原文:https://www.cnblogs.com/VividBinGo/p/11354137.html