首页 > 其他分享 >HDU 3349 Consumer

HDU 3349 Consumer

时间:2022-10-25 11:38:22浏览次数:94  
标签:HDU 3349 last 主件 int 物品 背包 附件 Consumer


​题目链接​

题目背景

有依赖的背包,下面用我常用的变量和说法。

题目大意

个主件和块钱,每个主件都有费用和对应的个附件,附件也有费用与价值,购买主件后才能购买附件,问怎样购买才能使得到的价值最大。

输入格式

输入有多组,每组询问第一行是整数主件个数()和总钱数(),接下来有行,每行先输入两个整数主件费用()和附件个数(),然后有对数表示附件的费用)和价值

我们通过完善背包九讲中对有依赖背包的阐述来处理这道题:
我们可以对主件的附件集合先进行一次01背包(在本题中,该附件集合大小即为),得到费用依次为所有这些值时相应的最大价值即为总钱数去掉主件的费用后剩下的钱数,在一种可能的情况下这些钱都用来购买该主件和其下的附件)。那么这个主件及它的附件集合相当于有个物品的物品组(因为一共有那么多数),其中费用为的物品的价值为(此题中主件没有价值),该物品组中你只能选一件物品,因为每个物品即对应着一种附件选法。也就是说原来指数级的策略中有很多策略都是冗余的,通过一次01背包后,将主件及其附件转化为个物品的物品组,就可以直接应用分组背包的算法解决问题了。
再进一步说明一下,数组中存储的是“在的花费下,该组内的附件能提供的最大价值”。

回顾一下普通分组背包的做法:

for (int i = 1; i <= n; i++) {
cin >> s;
for (int j = 1; j <= s; j++) cin >> c[j] >> w[j];
for (int j = V; j >= 0; j--)
for (int k = 1; k <= s; k++)
if (j >= c[k])
f[j] = max(f[j], f[j - c[k]] + w[k]);
}

分组背包是通过外层枚举背包容量来更新状态,同时倒序保证了每组物品中只有一个被选,不断更新费用下的最大价值。

按照上面的解释写出代码:

#include <bits/stdc++.h>
#define A 100010

using namespace std;
int n, V, v, w, c, m, f[A], f_last[A];

int main(int argc, char const *argv[]) {
while (~scanf("%d%d", &n, &V)) { //n主件个数,V总钱数
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++) {
memcpy(f_last, f, sizeof(f_last)); //需要继承上一组物品的最优情况,可避免使用二维数组
// ↑相当于实现第二次背包
scanf("%d%d", &v, &m); //v主件费用,m附件个数
for (int k = 1; k <= m; k++) {
scanf("%d%d", &c, &w); //c附件费用、w附件价值
for (int j = V - v; j >= c; j--)
f_last[j] = max(f_last[j], f_last[j - c] + w);
}
for (int j = v; j <= V; j++) f[j] = max(f[j], f_last[j - v]);
// f数组为加上主件的费用后的最大价值
}
printf("%d\n", f[V]);
}
}


标签:HDU,3349,last,主件,int,物品,背包,附件,Consumer
From: https://blog.51cto.com/lyle/5794321

相关文章

  • HDU 1465(错排公式)
    不容易系列之一TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):9829    AcceptedSubmission(s):......
  • HDU 4585(Shaolin-Treap的lower_bound&upper_bound操作)
    题意:有n个数,每个数进来时求出与它与它最接近的数的编号(多个答案选数小的)模板测试#include<iostream>#include<cmath>#include<algorithm>#include<cstdio>#include<cst......
  • 4.5 Kafka Consumer API之多线程并发处理
    1.Consumer一对一消费Partition(1).简介这种类型是经典模式,每一个线程单独创建一个KafkaConsumer消费一个partition,用于保证线程安全。(2).代码示例publicclassKafkaCon......
  • Kafka Consumer指定时间戳位置消费消息
    KafkaConsumer指定时间戳位置消费消息若用户不想从最旧的或最早的offset位置开始消费,想指定某个时间戳位置开始消费,是否可行呢?答案:可行的用户给定时间戳,kafkaserve......
  • B - K-th Number HDU - 6231 (尺取+二分)WindowsSource 2017中国大学生程序设计竞赛-哈
    题意给你数列A,对于A的长度\(\geqlen\)的所有区间内的找出第k大的数,然后放到另一个数组中。然后在新数组中找到第M大的数。思路代码......
  • HDU2376——Average distance(思维+树形DP)
    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2376原文:https://www.codenong.com/cs109682980/题意:给定一棵树,有边权,求树上任意两点之间距离的和的平均值。思路......
  • hdu 1979 DFS + 字典树剪枝
    ​​http://acm.hdu.edu.cn/showproblem.php?pid=1979​​FilltheblanksTimeLimit:3000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)Tota......
  • HDU1232畅通工程
    畅通工程TimeLimit:4000/2000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):62539    AcceptedSubmission(s):33472......
  • HDU1863畅通工程
    畅通工程TimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):35107    AcceptedSubmission(s):15572......
  • HDU1222 Wolf and Rabbit
    A-WolfandRabbitWolfandRabbitTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):9786    Accep......