博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
混合背包 hdu5410 CRB and His Birthday
阅读量:6803 次
发布时间:2019-06-26

本文共 1299 字,大约阅读时间需要 4 分钟。

传送门:

题意:你有M块钱,如今有N件商品

第i件商品要Wi块,假设你购买x个这种商品。你将得到Ai*x+Bi个糖果

问能得到的最多的糖果数

思路:很好的一道01背包和全然背包结合的题目

首先,对于第i件商品,假设仅仅买1个,得到的价值是Ai+Bi

假设在买1个的基础上再买。得到的价值就是Ai

也就是说,除了第一次是Ai+Bi。以后购买都是Ai

那么,我们是否能将i商品拆分成两种商品,当中两种商品的代价都是Wi,

第一种的价值是Ai+Bi,可是仅仅同意买一次

另外一种的价值是Ai。能够无限次购买

接下来我们来讨论这样拆的正确性

理论上来讲,买另外一种之前。必需要买第一种

可是对于这道题,由于Ai+Bi>=Ai是必定的,由于Bi肯定是非负

所以对于代价同样。价值大的肯定会被先考虑

换句话来说,假设已经開始考虑另外一种商品了。那么第一种商品就肯定已经被加入到背包里了~

所以。这题我们把n件商品拆分成2*n件商品。对于第一种商品做01背包,对于另外一种商品做全然背包,这样就把题目转换成了很熟悉的题目。也就能顺利AC了

#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define FIN freopen("input.txt","r",stdin)using namespace std;typedef long long LL;typedef pair
PII;const int MX = 2e4 + 5;int dp[MX];int A[MX], B[MX], rear;int main() { int T, V, n; //FIN; scanf("%d", &T); while(T--) { memset(dp, 0, sizeof(dp)); scanf("%d%d", &V, &n); for(int i = 1; i <= n; i++) { int w, a, b; scanf("%d%d%d", &w, &a, &b); A[i] = w; B[i] = a + b; A[i + n] = w; B[i + n] = a; } for(int i = 1; i <= n; i++) { for(int j = V; j >= A[i]; j--) { dp[j] = max(dp[j], dp[j - A[i]] + B[i]); } } for(int i = 1 + n; i <= 2 * n; i++) { for(int j = A[i]; j <= V; j++) { dp[j] = max(dp[j], dp[j - A[i]] + B[i]); } } printf("%d\n", dp[V]); } return 0;}

转载地址:http://vijwl.baihongyu.com/

你可能感兴趣的文章
ARM给服务器厂商更多创新机会
查看>>
[2011 年终项目总结] 第六章、网站测试
查看>>
找到7天内要过生日的记录
查看>>
获取桌面DC: GetDC(GetDesktopWindow())与GetDC(NULL)
查看>>
Objective-C 基础,类和对象,方法和消息,已声明的属性和存取方法,块对象,协议和范畴类,预定义类型和编码策略...
查看>>
NDK编译时指定NDK_MODULE_PATH的方法
查看>>
解决Android 应用运行报Unable to resolve superclass of L错误
查看>>
经典排序之 归并排序
查看>>
调用手机震动
查看>>
编程珠玑:位图法排序
查看>>
CREATEMUTEX
查看>>
矢量数据压缩:道格拉斯普克算
查看>>
IIS添加对ashx文件的支持
查看>>
Top Down Operator Precedence - 自顶向下算符优先分析法
查看>>
android 来电自动接听和自动挂断
查看>>
SharePoint2010 获取网站集SPSite,SPWeb对象的4种方法
查看>>
poj 1607 Deck(坑爹的水题啊)
查看>>
Asterisk 函数
查看>>
你看得到工具的本质吗
查看>>
EF架构~看看下面这代码,你还敢用它的延时加载吗?
查看>>