分组背包(通天之分组背包)

分组背包是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;
}

原文地址:https://www.cnblogs.com/damaoranran/p/9085815.html

时间: 2024-10-21 07:27:30

分组背包(通天之分组背包)的相关文章

洛谷——P1757 通天之分组背包

https://www.luogu.org/problem/show?pid=1757#sub 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入输出格式 输入格式: 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式: 一个数,最大的利用价值

洛谷 P1757 通天之分组背包 【分组背包】

题目链接:https://www.luogu.org/problemnew/show/P1757#sub 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入输出格式 输入格式: 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式: 一个数,最大的利用价值 输入输出样例 输入样例#1:

dp--分组背包 P1757 通天之分组背包

题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入格式 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式 一个数,最大的利用价值 有容积为V的背包,有n件物品,每种物品属于的组别不同,t为最大的组数,每组中的物品相互冲突,所以只能选其中一件 接

android系统联系人分组特效实现(1)---分组导航和挤压动画

1.打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&q

hdoj 1203 I NEED A OFFER! 【另类01背包】【概率背包】

题意:... 策略:动态规划. 因为是求至少能得到一个offer的概率,那我们可以反着求,求得不到一个offer的概率,最后用1减去就好了. 代码: #include<string.h> #include<stdio.h> double dp[10010]; struct node{ int a; double b; }s[10010]; int main() { int n, m, i, j; while(scanf("%d%d", &n, &

多重背包转换成完全背包和01背包

void CompletePack(int cost,int weight)   多重背包 { for(int i=cost;i<=m;i++) dp[i]=max(dp[i],dp[i-cost]+weight); } void ZeroOnePack(int cost,int weight)    01背包 { for(int i=m;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+weight); } void MultiplyPack(int cost,

01背包模板、全然背包 and 多重背包(模板)

转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 模版就直接贴代码: 01背包模板: /* 01背包问题 01背包问题的特点是,">每种物品仅有一件.能够选择放或不放. 01背包问题描写叙述: 有N件物品和一个容量为V的背包. 第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品

mysql按字段分组并获取每个分组按照某个字段排序的前三条

这是原始数据 想按照brand_id分组 并获取每个分组total_num最高的前3位 SQL语句为: select a.* from data a where 3 > (select count(*) from data where brand_id = a.brand_id and total_num > a.total_num ) order by a.brand_id, a.total_num desc; 得到结果

nyoj 860 又见01背包 【另类01背包】

分析: 首先这道题不能当做普通的01背包问题,因为W <= 10^9,开不了,那么大的数组,肯定有其他的思路,观察一下我们知道价值v小的很,最大100, 那我们就可以利用这一点,拿价值 之和作为原来的质量之和, 但是有一点要注意:因为题意是要在质量不超过W的范围内,找出最大的价值,我们现在是以最大的价值求质量,那么仔细分析一下,我们就能想明白,要以某价值i的背包存放尽量小的质量,这样反过来分析一下就可以知道,较小的质量有个较大的价值序号,这样完全满足题意了, 最后还有一点,就是价值背包的每一个(