水题 WA了好多次 ,先判断小于五是直接输出,然后用continue继续循环,用break了,WA了好多次。。。。再将总的余额减5然后01背包。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int cmax(int a,int b)
{
return a>b?a:b;
}
int main()
{
int w[1010];
int f[1010];
int n,m;
while(scanf("%d",&n)&&n)
{
int max=-1;
int pos=0;
for(int a=1;a<=n;a++)
{
scanf("%d",&w[a]);
if(max<w[a])
{
max=w[a];
pos=a;
}
}
scanf("%d",&m);
if(m<5)
{
cout<<m<<endl;
continue;
}
for(int k=0;k<=m;k++)
f[k]=0;
for(int i=1;i<=n;i++)
{
if(i==pos)
continue;
for(int j=m-5;j>=w[i];j--)
f[j]=cmax(f[j],f[j-w[i]]+w[i]);
}
cout <<m-f[m-5]-max<< endl;
}
return 0;
}