先上代码再说我看了其他大佬的题解后的理解
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxnum=1050;
int n;
int m;
int price[maxnum];
int dp[maxnum][maxnum];
int main()
{
memset(price,0,sizeof(price));
memset(dp,0,sizeof(dp));
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
cin>>price[i];
sort(price,price+n+1);
cin>>m;
if(m<5)
cout<<m<<endl;
else{
for(int i=1;i<n;i++)
{
for(int j=1;j<=m-5;j++)
{
if(j<price[i])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-price[i]]+price[i]);
}
}
cout<<m-dp[n-1][m-5]-price[n]<<endl;
}
}
return 0;
}
首先这个题是一个很常规的01背包问题,就看能不能对问题进行一个合理的转化,题中的五元很重要,我们可以先预留出5元,剩余的钱就可以理解为我们的背包容量大小,我们最多可以装多少钱的东西,这里还要注意一个细节,先对价格进行排序,留着最贵的那个最后我们用五元减去它.