根据上一篇文章,我们可以从空间复杂度上优化一下代码,即想一下是不是可以使用一维数组搞定。
根据代码意思,我们要知道,如果在第二个循环时保证每次主循环中我们以j=V开始推f[v],这样就能保证推f[v]时f[v-c[i]]保存的都是状态f[i-1][v-c[i]]的值。
具体代码如下:
#include <cstdio>
#include <cstring>
int sum_values[1005];
int main()
{
int T;
int N,V;
int i,j;
while(scanf("%d %d",&N,&V)&&(N+V))
{
int weight[1001],value[1001];
for (i=1;i<=N;i++)
{
scanf("%d",&weight[i]);
scanf("%d",&value[i]);
}
memset(sum_values,0,sizeof(sum_values));
for (i=1;i<=N;i++)//从第一种水果开始一直到第N种水果
for(j=V;j>=weight[i];j--)//从满的状态开始,且第j个状态容量应该要大于第i个种类的大小
if (sum_values[j-weight[i]]+value[i]>sum_values[j])//如果第j个状态之前即第j-1个状态放入一个第i类的水果,并且放入后总价值大于第j个状态的价值,则第j-1个状态时选择放入
sum_values[j] = sum_values[j-weight[i]]+value[i];
printf("%d\n",sum_values[V]);
}
return 0;
}