这道题目实际上就是一道01背包的变形,只不过v[i]和w[i]相等,并且还要提前减掉一个五,我们将总的金额减去五,然后对剩下的V-5进行背包,并且留下最大的值给最后的剩余的五处理,具体看代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,V,w[1005],dp[1005];
while(cin>>n){
if(n == 0)break;
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++)
cin>>w[i];
cin>>V;
sort(w+1,w+1+n);
if(V < 5) cout<<V<<endl;
else{
for(int i = 1;i < n;i++)
for(int j = V-5;j >= w[i];j--)
dp[j] = max(dp[j],dp[j-w[i]]+w[i]);
cout<<V-dp[V-5]-w[n]<<endl;
}
}
return 0;
}