对于01背包和完全背包,无论是空间复杂度还是时间复杂度,最优的方法还是使用一维数组进行实现。
基于01背包的分析,由于不必考虑物品的重复放入,故v的循环采用顺序即可。代码如下:
#include
using namespace std;
int maxV[201];
int weight[11];
int value[11];
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 = 0; i < N; ++i)
{
for(j = weight[i]; j <= V; ++j)
{
int tmp = maxV[j-weight[i]]+value[i];
maxV[j] = (maxV[j] > tmp) ? maxV[j] : tmp;
}
}
printf("%d",maxV[V]);
}
基于01背包的分析,由于不必考虑物品的重复放入,故v的循环采用顺序即可。代码如下:
#include
using namespace std;
int maxV[201];
int weight[11];
int value[11];
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 = 0; i < N; ++i)
{
for(j = weight[i]; j <= V; ++j)
{
int tmp = maxV[j-weight[i]]+value[i];
maxV[j] = (maxV[j] > tmp) ? maxV[j] : tmp;
}
}
printf("%d",maxV[V]);
}