我们知道,在01背包和完全背包的实现中,都是针对每种物品进行讨论,即外循环都是for i=0…n,然后每种物品对于容量v的变化而求得最大价值;
在完全背包中,由于物品的件数无限,所以我们可以倒过来想,我们针对每个容量讨论,外循环为容量,对于每个容量j,我们求j对于所有物品能装载的最大价值,这样一来我们就能将时间复杂度降为O(N*V)了。代码如下:
#include
using namespace std;
int maxValue[201][11];
int weight[11];
int value[11];
int maxV[201];
int V, N;
void main()
{
int i, j;
scanf("%d %d",&V, &N);
for(i = 0; i < N; ++i)
{
scanf("%d %d",&weight[i],&value[i]);
}
for(i = 1; i <= V; ++i)
{
int i_maxV = 0;
for(j = 0; j < N; ++j)
{
if(i >= weight[j])
{
int tmp = maxV[i-weight[j]] + value[j];
maxValue[i][j] = maxV[i-1] > tmp ? maxV[i-1] : tmp;
}else
{
maxValue[i][j] = maxV[i-1];
}
if(maxValue[i][j] > i_maxV)
{
i_maxV = maxValue[i][j];
}
}
maxV[i] = i_maxV;
}
printf("%d",maxV[V]);
freopen("C:\\dp.txt","w",stdout);
for(i = 0; i <= V; ++i)
{
for(j = 0; j < N; ++j)
{
printf("%d ",maxValue[i][j]);
}
printf("
%d\n",maxV[i]);
}
}