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/ ...
随机推荐
- poj 3321 单点更新 区间求和
Apple Tree Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java c ...
- uniGUI 通过SessionList操作另外的登录用户
参照bbs,写了这个方法,检查是否有同名用户已经登录:procedure TUniMainModule.CheckSameUser(aUserLoginCode: string);var ASess ...
- fastscript例子一
fastscript例子一 fastscript例子一 unit Unit1; interface usesWinapi.Windows, Winapi.Messages, System.SysU ...
- ios调用系统界面显示英文
调用系统相册界面 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.sourceType ...
- 应该知道的Linux技巧【转】
这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?>—— Linux用户 ...
- ASP.NET自定义错误页并返回正确的500、404状态码
在项目中,我们常常需要自定义错误页面,但往往返回的状态码都变成了200,对SEO很不友好.我尝试过在百度上寻找解决方案,但找到的资料中说的方法都试过了,发现都是无法返回正确的状态码的. 最后,只好自已 ...
- html5 Ajax 访问.net WebApi获取视频流
http://localhost//api/Test/GetVideo?filename=/GoodVideo/e36a144b-52cd-4174-93d2-cfc41aea6c1d.mp4 是AP ...
- Grid++repor报表连接事件
//定义报表模板 private GridppReport Report = new GridppReport(); //载入报表模板数据 Report.LoadFromFile(GridppRepo ...
- WPF放大镜效果
在做WPF项目中,不止两个项目需要有放大镜功能. 第一个项目是一个手术室的远程示教系统,主要是为了方便专家演示病症时,可以放大图片上的某些部位. 第二个项目是一个工厂的MES项目,其中有个功能是质量预 ...
- MVC 5使用ViewBag(对象)显示数据
前面Insus.NET有演示使用ViewData来实现控制器与视图的通讯.如果想了解的话,可以从下面两个链接可以查看:<MVC 5使用ViewData(对象)显示数据>http://www ...