该题WA了几次,一直找不出错误,后来经过livs的指导,我们先拿出5元,这5元一定是买价钱最贵的菜,这样才能保证剩余的钱最少,那么我们还要做一件事就是选取最贵的菜,这两件事处理好了,就是一件简单的01背包。
#include<stdio.h>
#include<stdlib.h>
int ZeroOnePack( int price[],int money,int n ,int pos,int max)
{
int f[1024]={0};
for( int i=1; i<=n; i++ )
{
if( i!=pos )
for( int j=money-5 ; j>=0; j-- )
{
int t=j-price[i];
if(t>=0 && f[j]<f[t]+price[i] )
f[j]=f[t]+price[i];
}
}
return money-f[money-5]-max;
}
int main( )
{
int n,money,price[1024];
while( scanf( "%d",&n ),n )
{
int max=0,pos;
for( int i=1; i<=n; i++)
{
scanf( "%d" ,&price[i] );
if( max<price[i] )
{
pos=i;
max=price[i];
}
}
scanf( "%d",&money );
if( money>=5 )
printf( "%d\n",ZeroOnePack( price,money,n ,pos,max) );
else printf( "%d\n",money );
}
return 0;
}