第六重关:分组背包

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

相关文章

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

【前端学习】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>