01背包深度解读(一维数组法)+详细程序

根据上一篇文章,我们可以从空间复杂度上优化一下代码,即想一下是不是可以使用一维数组搞定。

根据代码意思,我们要知道,如果在第二个循环时保证每次主循环中我们以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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值