zoukankan      html  css  js  c++  java
  • 分组背包(通天之分组背包)

    分组背包是01背包的变形。

    所解决的问题是,在多类物品中的每一类选出一个物品,在有限的容量内获得最大价值。

    所注意的是3重for的顺序。在这里其实不用多讲,只要明白递归就可以了。

    建议搜分组背包的博客,其实只要记住最后才是每一类中放还是不放物品即可。

    例题:

    通天之分组背包

    题目背景

    直达通天路·小A历险记第二篇

    题目描述

    自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。

    输入输出格式

    输入格式:

    两个数m,n,表示一共有n件物品,总重量为m

    接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数

    输出格式:

    一个数,最大的利用价值

    输入输出样例

    输入样例#1: 复制
    45 3
    10 10 1
    10 5 1
    50 400 2
    输出样例#1: 复制
    10

    代码如下:

    #include<iostream>
    using namespace std;
    #define N 1000
    int dp[N];
    int w[101][10000];
    int c[101][10000];
    int num[101];
    int max(int a, int b)
    {
     return a > b ? a : b;
    }

    int main()
    {
     int v, n;
     int a, b, m, kk=0;
     cin >> v >> n;
     for (int i = 1; i <= n; i++)
     {
      cin >> a >> b >> m;
      kk = max(m, kk);
      num[m]++;
      w[m][num[m]] = a;
      c[m][num[m]] = b;
     }

     for (int i = 1; i <= kk; i++)
     {
      for (int j = v; j >= 0; j--)
      {
       for (int p = 1; p <= num[i];p++)    //每个类中的物品
       if (j >= w[i][p])
        dp[j] = max(dp[j], dp[j - w[i][p]] + c[i][p]);
      }
     }
     cout << dp[v] << endl;
    }

  • 相关阅读:
    算法笔记4
    算法笔记3
    SQLServer 两种分页方式
    Git 使用笔记
    Docker MongoDB 笔记
    Abp vNext 修改Identity模块用户管理界面的坑
    CentOS安装MariaDB
    Visio修改页边距
    在 PowerDesigner 导入Excel中的表结构
    Uploadify上传失败,提示 2156 SecurityError Error #2156 null的解决办法
  • 原文地址:https://www.cnblogs.com/damaoranran/p/9085815.html
Copyright © 2011-2022 走看看