3.17

01背包---每个物品最多用一次

int v[MAXN];    // 体积
int w[MAXN];    // 价值 

for(int i = 1; i <= n; i++) //总个数
        for(int j = 0; j <= m; j++)//总体积
        {
            //  当前背包容量装不进第i个物品,则价值等于前i-1个物品
            if(j < v[i]) 
                f[i][j] = f[i - 1][j];
            // 能装,需进行决策是否选择第i个物品
            else    
                f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
        }           

    cout << f[n][m] << endl;

//优化

for (int i=1; i<=n;i++)

for (int j=m; j>=v[i];j--)

f[j]=max (f[j], f[j-v[i]]+w[i]);
完全背包---无限次

for (int i=1; i<= n; i++)//个数
   for (int j=0; j<=m; j++)//体积
    {
      for (int k=0; k *v[i]<=j ; k++) // 无限次
        f[i][j] = max (f[i][j], f[i-1][j-k*v[i]] + k *w[i]);
    }
   cout << f[n][m] << endl;
//优化

for (int i=1;i<= n; i++)

  for (int j = v[i]; j <=m; j++)

   f[j] = max(f[j], f[j-v[i]]+ w[i]);

cout << f[m];

//01背包(由于物体个数只有一个) 从后往前枚举体积

完全背包( 由于物体个数不限)从前往后枚举体积
当然这都是在优化成一维的情况下的写法 不优化空间的话怎么遍历都行
当用到i-1层时,从后面遍历,当用到第i层时,从前面遍历
 

多重背包

cin >> n >> m;
   for (int i=1; i<=n;i++) cin >> v[i] >> w[i] >> s[i];

   for (int i=1; i<=n; i++)
    for (int j=0; j<=m; j++)
     for (int k=0; k<=s[i] && k *v[i]<=j; k++)
      f[i][j] = max(f[i][j], f[i-1][j - v[i] * k] + w[i] * k);
 cout << f[n][m]<< endl;

 

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值