第六重关:分组背包

2024-04-22 07:18
文章标签 分组 背包 第六 重关

本文主要是介绍第六重关:分组背包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

已知如下条件:

    N个物品

    容量为V的背包

    vi:第i个物品所占用的容量空间

    valuei:第i个物品所获得的价值数值

    这些背包被分成了p个组,并且每个组里面的物品最多选择一件或者不选

求解:

    该背包可以装下的最大价值是多少?

解题思路:

如果不看组内的细节的话,其实这就是一个01背包,所以第一层FOR循环,显然就是遍历组别。对于一个分组,有两种结果,选取组内最好的和不选。那么在第二重FOR的时候表示,是否选取这个组别,如果选取该组,那么我就要选取该组中价值最高。如果不选,那就不去选择即可。

for (int i = 1; i <= P; i++)
{    for (int j = V; j >= 0; j--){for (int k: Park[i]){if (j > v[k]){dp[j] = MAX(dp[j], dp[j - v[k]] + w[k]);}}}
}

题目:HDU 4341(这题目要是读不懂,对不起自己童年)

注意点:1)计算斜率的时候要注意y是不能等于0的,但是x是可以等于0的;2)如果斜率一样的话要按照y的大小进行排序,原因是钩子是从上面往下放出去的。它一定要先抓浅层的金矿,然后才能去抓深层的金矿。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int max_N = 201;
const int max_T = 40001;
const double eps = 0.000001;
struct NODE
{int x, y;int t, v;double mult;
}node[max_N];bool cmp(NODE a, NODE b)
{if (a.mult != b.mult) return a.mult < b.mult;else if (a.y != b.y) return a.y < b.y;
}double ABS(const double x)
{if (x > 0) return x;else return -x;
}int MAX(const int x, const int y)
{if (x > y) return x;else return y;
}int main()
{int N, T;int Case = 0;while (cin>> N>> T){int dp[max_T], tmp[max_T];memset(dp, 0, sizeof(dp));for (int i = 1; i <= N; i++){cin>> node[i].x>> node[i].y>> node[i].t>> node[i].v;node[i].mult = node[i].x*1.0 / node[i].y;}sort(node+1, node+N+1, cmp);for (int i = 2; i <= N; i++){if (node[i].mult == node[i-1].mult){node[i].t += node[i-1].t;node[i].v += node[i-1].v;}}for (int i = 1; i <= N; ){int k;for (int j = T; j >= 0; j--){for (k = i; k <= N && ABS(node[k].mult - node[i].mult) < eps; k++){if (node[k].t <= j){dp[j] = MAX(dp[j], dp[j-node[k].t] + node[k].v);}}}i = k;}cout<< "Case "<< ++Case<< ": ";cout<< dp[T]<< endl;}return 0;
} 

 

 

这篇关于第六重关:分组背包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925125

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

多重背包转换成0-1背包

http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^