这是一道赤裸裸的简单的完全背包,在HDU 2602中我说过在01背包优化的算法中提醒要注意v V--0,而不是0--V ,其实反过来就是完全背包;
这个算法使用一维数组,先看伪代码:
for i=1..N
for v=0..V
f[v]=max{f[v],f[v-cost]+weight}
你会发现,这个伪代码与P01的伪代码只有v的循环次序不同而已。这里还是要啰嗦一下,
#include<stdio.h>
#include<stdlib.h>
int a[3]={ 150,200,350 };
int DP( int money )
{
int f[10024]={ 0 };
for( int i=0;i<=2; i++ )
{
for( int j=0;j<=money; j++ )
if( j>=a[i]&&f[j-a[i]]+a[i]>f[j] )
f[j]=f[j-a[i]]+a[i];
}
return money-f[money];
}
int main()
{
int n,money;
scanf( "%d",&n );
for( int i=0; i<n; i++ )
{
scanf( "%d",&money );
printf( "%d\n",DP(money) );
}
return 0;
}