hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2191
思路
由于每种大米可能不止一袋,所以是多重背包问题,可以直接使用解决多重背包问题的方法,也可以将多重背包转化为01背包后求解。
代码
01背包:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = * + ;
int m[N], w[N]; //记录每袋大米的价格、重量
int dp[N]; int main()
{
//freopen("hdoj2191.txt", "r", stdin);
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
int cnt = ; //共有cnt袋大米
for (int i = ; i < k; i++)
{
int p, h, c;
cin >> p >> h >> c;
for (int j = ; j < c; j++)
{
m[cnt] = p;
w[cnt] = h;
cnt++;
}
} memset(dp, , sizeof(dp));
for (int i = ; i < cnt; i++)
{
for (int j = n; j >= m[i]; j--)
dp[j] = max(dp[j], dp[j - m[i]] + w[i]);
}
cout << dp[n] << endl;
}
return ;
}
多重背包:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = * + ;
int m[N], w[N], num[N];
int dp[N]; void zero_one_pack(int weight, int value, int capacity)
{
for (int i = capacity; i >= weight; i--) //逆序
dp[i] = max(dp[i], dp[i - weight] + value);
} void complete_pack(int weight, int value, int capacity)
{
for (int i = weight; i <= capacity; i++) //正序
dp[i] = max(dp[i], dp[i - weight] + value);
} void multiple_pack(int weight, int value, int amount, int capacity)
{
if (weight*amount >= capacity)
complete_pack(weight, value, capacity);
else
{
int k = ;
while (k <= amount)
{
zero_one_pack(weight*k, value*k, capacity);
amount -= k;
k *= ;
}
zero_one_pack(weight*amount, value*amount, capacity);
} } int main()
{
//freopen("hdoj2191.txt", "r", stdin);
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
for (int i = ; i < k; i++)
cin >> m[i] >> w[i] >> num[i]; memset(dp, , sizeof(dp));
for (int i = ; i < n; i++)
multiple_pack(m[i], w[i], num[i], n);
cout << dp[n] << endl;
}
return ;
}
hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)的更多相关文章
- 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活--hdu2191(多重背包模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 标准的多重背包 题目 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是 ...
- dp--01背包,完全背包,多重背包
背包问题 以下代码 n是物品个数,m是背包容积 物品价值和重量int v[maxn],w[maxn]; 01背包 模板 for(int i = 0; i < n; i++) { for(int ...
- HDU2191_悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(背包/多重背包)
解题报告 题目传送门 题意: 中文不多说; 思路: 基础多重背包,每一个物品有多个能够选.转换成01背包解. #include <iostream> #include <cstrin ...
- hdoj1171 Big Event in HDU(01背包 || 多重背包)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意 老师有一个属性:价值(value).在学院里的老师共有n种价值,每一种价值value对应着 ...
- POJ 3260 The Fewest Coins(完全背包+多重背包=混合背包)
题目代号:POJ 3260 题目链接:http://poj.org/problem?id=3260 The Fewest Coins Time Limit: 2000MS Memory Limit: ...
- (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)
http://poj.org/problem?id=3260 Description Farmer John has gone to town to buy some farm supplies. ...
- POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)
题意:FJ身上有各种硬币,但是要买m元的东西,想用最少的硬币个数去买,且找回的硬币数量也是最少(老板会按照最少的量自动找钱),即掏出的硬币和收到的硬币个数最少. 思路:老板会自动找钱,且按最少的找,硬 ...
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- POJ 1787 Charlie's Change (完全背包/多重背包,输出方案的物品个数)
网上说是多重背包,因为要输出方案,还要记录下路径,百度一下题解就可以. 自己做的时候,还没了解过多重背包,该题直接往完全背包思考了.咖啡的钱看作总的背包容量,1.5.10.25分别代表四种物品的重量, ...
随机推荐
- [ONTAK2015]Bajtman i Okrągły Robin
bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin Time Limit: 40 Sec Memory Limit: 256 MB Description 有 ...
- DFS——>记忆化搜索——>动态规划
以洛谷P1802 5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...
- [csp-201403-3]命令行选项
#include<bits/stdc++.h> //#include <sstream> // if want to use stringstream using namesp ...
- UVA1386 【Cellular Automaton】题解
题面:UVA1386 Cellular Automaton 矩阵乘法+快速幂解法: 这是一个比较裸的有点复杂需要优化的矩乘快速幂,所以推荐大家先做一下下列洛谷题目练练手: (会了,差不多就是多倍经验题 ...
- 信息安全学习笔记--CSRF
一.CSRF简介 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者“session riding”,通常缩写为CS ...
- 关于UDP数据报引发“异步错误”的疑问
在UNP卷一第三版的第8章8.9小节中说到:如果udp服务器没有启动,udp客户端在使用sendto发送一行文本后,将会等待一个永远也不会出现的应答从而阻塞在recvfrom调用上. 由于服务器段不存 ...
- HTML 解析 textarea 中的换行符
用户在textarea中输入的换行符,传到后台,再返回前端,展示在div中. 如果需要div显示为与textarea 一致的效果,需添加: .detail { white-space: pre-lin ...
- 个人对java中对象锁与类锁的一些理解与实例
一 什么是对象锁 对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,所有它只会锁住当前的对象,而并不会对其他对象实例的锁产生任何影响,不同对象访问同一个 ...
- 嵌入式linux/android alsa_aplay alsa_amixer命令行用法
几天在嵌入式linux上用到alsa command,网上查的资料多不给力,只有动手一点点查,终于可以用了,将这个使用方法告诉大家,以免大家少走弯路. 0.先查看系统支持哪几个alsa cmd: ll ...
- bash脚本里su命令执行
俩种方法 1.可以使用 <<EOF 参数实现. 脚本内容:cat test.sh代码如下: #!/bin/bashsu - test <<EOFpwd;exit;EOF 2.当 ...