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;
    }

  • 相关阅读:
    解决CentOS(6和7版本),/etc/sysconfig/下没有iptables的问题
    centOS7在VirtualBox中装好后的网络连接问题
    [bzoj1022/poj3480]小约翰的游戏John_博弈论
    [poj2311]Cutting Game_博弈论
    [poj1704]Georgia and Bob_博弈论
    [poj2368]Buttons_博弈论
    NOIP2015 提高组合集
    NOIP2014 提高组合集
    NOIP2013 提高组合集
    NOIP2012 提高组合集
  • 原文地址:https://www.cnblogs.com/damaoranran/p/9085815.html
Copyright © 2011-2022 走看看