Charm Bracelet(01背包问题)
题目链接:
https://vjudge.net/problem/POJ-3624
题目描述:
Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible from the N (1 ≤ N≤ 3,402) available charms. Each charm i in the supplied list has a weight Wi(1 ≤ Wi ≤ 400), a 'desirability' factor Di (1 ≤ Di ≤ 100), and can be used at most once. Bessie can only support a charm bracelet whose weight is no more than M (1 ≤ M ≤ 12,880).
Given that weight limit as a constraint and a list of the charms with their weights and desirability rating, deduce the maximum possible sum of ratings.
Input
* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: Line i+1 describes charm i with two space-separated integers:Wi and Di
Output
* Line 1: A single integer that is the greatest sum of charm desirabilities that can be achieved given the weight constraints
Sample Input
4 6
1 4
2 6
3 12
2 7
Sample Output
23
题意描述:
输入物品的数量和限重
计算并输出在此限重下,能获得的最大价值
解题思路:
问题 在N件物品中挑选,重量不超过M的情况下,能获得的最大价值是多少
抽象问题也是当前状态为 从前i件物品中挑选,重量不超过j的情况下,能获得的最大价值是多少
变量 i j
对于每件物品,有两种不同的取法,取,则下一个问题变为从前i-1件物品中挑选,重量不超过j-w[i]的情况下,能做的的最大价值是多少
不取,则下一个问题变为从前i-1件物品中挑选,重量不超过j的情况下,能做的最大价值是多少
那么归结状态转移方程为:
f[i][j]= max(f[i-1][j-w[i]]+d[i],f[i-1][j]) 当i>1
0 当i=1且j<w[1]
w[1] 当i=1且j>=w[1]
由于存储数据的是二维数组,当N*M特别大的时候,往往出现超时错误,又发现结果可以用一个一维数组存储,因为f[i][j]的值只和它正上方的元素以及左上方的元素有关,换句话说就是
每一个问题的下一个问题都是从i-1件物品中取,从而考虑将i这个变量去掉。
如果能将求出的f[i][j]的值放在f[i-1][j]里面,则f数组就可以使用一维数组代替了。考虑如果从左往右计算,
f[i-1][j]的值先比f[i][j]的值先更新,而f[i-1][j]的值在求之后的f[i][k](k>j)的值的时候用到,所以不能从左往右。考虑从右往左计算,也就是先用大的限重去装,也不影响最后结果
的正确性。故采用滚动数组如下
for(i=;i<=n;i++)
for(j=m;j>=;j--)
if(a[i].w <= j)
f[j]=max(f[j],f[j-a[i].w]+a[i].d);
代码实现:
#include<stdio.h>
struct node{
int w,d;
};
int max(int x,int y){
return x>y?x:y;
} int main()
{
int n,m,i,j;
struct node a[];
int f[];
while(scanf("%d%d",&n,&m) != EOF)
{
for(i=;i<=n;i++)
scanf("%d%d",&a[i].w,&a[i].d);
for(i=;i<=m;i++)//初始化,在前1种物品中选取,在体积不超过i的情况下所能获得的最大价值
if(a[].w<=i)
f[i]=a[].d;
else
f[i]=;
for(i=;i<=n;i++)
for(j=m;j>=;j--)
if(a[i].w <= j)
f[j]=max(f[j],f[j-a[i].w]+a[i].d);
printf("%d\n",f[m]);
}
return ;
}
Charm Bracelet(01背包问题)的更多相关文章
- poj 3624 Charm Bracelet 01背包问题
题目链接:poj 3624 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即F [i, v]表示前i件物品恰放入一个容量为v 的背包可以 ...
- POJ 3624 Charm Bracelet(01背包)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 34532 Accepted: 15301 ...
- POJ 3624 Charm Bracelet(01背包裸题)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38909 Accepted: 16862 ...
- 洛谷——2871[USACO07DEC]手链Charm Bracelet——01背包
题目描述 Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like t ...
- POJ 3624 Charm Bracelet(01背包模板题)
题目链接 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 52318 Accepted: 21912 Descriptio ...
- poj3642 Charm Bracelet(0-1背包)
题目意思: 给出N,M,N表示有N个物品,M表示背包的容量.接着给出每一个物品的体积和价值,求背包可以装在的最大价值. http://poj.org/problem? id=3624 题目分析: o- ...
- POJ 3624 Charm Bracelet 0-1背包
传送门:http://poj.org/problem?id=3624 题目大意:XXX去珠宝店,她需要N件首饰,能带的首饰总重量不超过M,要求不超过M的情况下,使首饰的魔力值(D)最大. 0-1背包入 ...
- 洛谷 P2871 [USACO07DEC]手链Charm Bracelet && 01背包模板
题目传送门 解题思路: 一维解01背包,突然发现博客里没有01背包的板子,补上 AC代码: #include<cstdio> #include<iostream> using ...
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...
- [转]POJ3624 Charm Bracelet(典型01背包问题)
来源:https://www.cnblogs.com/jinglecjy/p/5674796.html 题目链接:http://bailian.openjudge.cn/practice/4131/ ...
随机推荐
- FastReport之实现打印固定行数,不足补打空白行的办法
在设置单据的打印模板的时候,我们有时候会遇到这样的情况:单据的内容很少,打印出来的效果不理想的情况,例如1.单据体与单尾之间有大量的空白: 2.单据体跟单尾连在一起,单尾后面的空白篇幅太大: 以上这两 ...
- 分形之龙形曲线(Dragon Curve)
龙形曲线(Dragon Curve)又叫分形龙,是一种自相似碎形曲线的统称,因形似龙的蜿蜒盘曲而得名. 一种简单的生成分形龙的方式是:拿着一条细长的纸带,把它朝下的一头拿上来,与上面的一头并到一起.用 ...
- FFmpeg4.0笔记:file2rtmp
Github: https://github.com/gongluck/FFmpeg4.0-study.git #include <iostream> using namespace st ...
- IE浏览器兼容性模式
最近支持公司的一个内部业务管理系统,系统是基于jQuery来实现:用了2年的MVVM框架的我转向这个完全使用jQuery框架来开发的系统,真是相当不爽(相信用过MVVM框架的跟我是相同的感受):更为憋 ...
- Android Dagger 2 无法自动生成 Dagger Component
给项目升级 gradle(3.0)和 build(27)后发现 Dagger 2 无法自动生成 Dagger Component 类了. 原因竟是我把 : kapt 'com.google.dagge ...
- Spring 全局异常处理
[参考文章]:Spring全局异常处理的三种方式 [参考文章]:Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 [参考文章]:@ControllerAdvic ...
- typescript-koa-postgresql 实现一个简单的rest风格服务器 —— typescript 开发环境配置
最近需要用 nodeJS 写一个后台程序,为了能够获得 IDE 的更多代码提示,决定用 typescript 来编写,随便也学习下 ts,在这记录下实现过程. 1.新建文件夹 typescript-k ...
- CentOS7.x编译安装nginx,实现HTTP2
网站使用HTTP2有助于网站加速及更安全,要配置HTTP2必须满足两个条件:①openssl的版本必须在1.0.2e及以上.②nginx的版本必须在1.9.5以上 一.准备工作 配置HTTP2之前需 ...
- 全网最详细的Sublime Text 3的安装Package Control插件管理包(图文详解)
不多说,直接上干货! 全网最详细的Windows里下载与安装Sublime Text *(图文详解) 全网最详细的Sublime Text 3的激活(图文详解) 全网最详细的Sublime Text ...
- 只用一招,让你Maven依赖下载速度快如闪电
一.背景 众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题 ...