题目链接:

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背包问题)的更多相关文章

  1. poj 3624 Charm Bracelet 01背包问题

    题目链接:poj 3624 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放.             用子问题定义状态:即F [i, v]表示前i件物品恰放入一个容量为v 的背包可以 ...

  2. POJ 3624 Charm Bracelet(01背包)

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34532   Accepted: 15301 ...

  3. POJ 3624 Charm Bracelet(01背包裸题)

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38909   Accepted: 16862 ...

  4. 洛谷——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 ...

  5. POJ 3624 Charm Bracelet(01背包模板题)

    题目链接 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 52318   Accepted: 21912 Descriptio ...

  6. poj3642 Charm Bracelet(0-1背包)

    题目意思: 给出N,M,N表示有N个物品,M表示背包的容量.接着给出每一个物品的体积和价值,求背包可以装在的最大价值. http://poj.org/problem? id=3624 题目分析: o- ...

  7. POJ 3624 Charm Bracelet 0-1背包

    传送门:http://poj.org/problem?id=3624 题目大意:XXX去珠宝店,她需要N件首饰,能带的首饰总重量不超过M,要求不超过M的情况下,使首饰的魔力值(D)最大. 0-1背包入 ...

  8. 洛谷 P2871 [USACO07DEC]手链Charm Bracelet && 01背包模板

    题目传送门 解题思路: 一维解01背包,突然发现博客里没有01背包的板子,补上 AC代码: #include<cstdio> #include<iostream> using ...

  9. 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)

    Charm Bracelet    POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...

  10. [转]POJ3624 Charm Bracelet(典型01背包问题)

    来源:https://www.cnblogs.com/jinglecjy/p/5674796.html 题目链接:http://bailian.openjudge.cn/practice/4131/ ...

随机推荐

  1. SRM475

    250pt: 题意:有最长N=17的一条格子,每个格子是W.B和R三种颜色之一,当某个格子上有兔子时,下一个回合该兔子按照以下的规则移动: 如果兔子在第一个格子,则向右移动一格: 否则如果兔子在倒数两 ...

  2. Legal or Not HDU

    Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  3. 笑话库存加网址http://www.jokeji.cn/list18_11.htm

    19.富二代王晓伟成绩很差,老爸想给他找个家教老爸:“儿子,想找什么样的家教啊?”儿子:“要漂亮的,女的,衣服不能太保守,花样要多!”老爸:“儿子,你TM指的是岛国的苍老师吗?”@呦呦ta爹 20.哥 ...

  4. Python自动化开发 -进程、线程和协程(二)

    本节内容 一.线程进程介绍 二. 线程 1.线程基本使用 (Threading) 2.线程锁(Lock.RLock) 3.信号量(Semaphore) 4.事件(event) 5.条件(Conditi ...

  5. Python自动化开发 - 字符编码、文件和集合

    本节内容 字符编码 文件操作 集合 一.字符编码 1.编码 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.解决思路:数字与符号建立一对一映射,用不同数字表示不同符号. ASCI ...

  6. jQuery WeUI V0.4.2 发布

    http://www.oschina.net/news/71590/jquery-weui-v0-4-2 jQuery WeUI V0.4.2 发布了! jQuery WeUI 中使用的是官方WeUI ...

  7. (原创)用c++11打造好用的any

    上一篇博文用c++11实现了variant,有童鞋说何不把any也实现一把,我正有此意,它的兄弟variant已经实现了,any也顺便打包实现了吧.其实boost.any已经挺好了,就是转换异常时,看 ...

  8. SQLite中sqlite3_column_value()的返回值

    sqlite3_column_value()的返回对象是一个 unprotected sqlite3_value 对象.一个不受保护的sqlite3_value object可能只能用于 sqlite ...

  9. 在ASP.NET Core中,静态类如何读取配置文件

    这是今天下午一个同事问我的问题,如何在静态类中读取json配置文件.我当时并没有告诉他如何如何去做,办法肯定是有,但是这种编程思维确实得改改了.静态类.静态方法不是面向对象编程的最佳实践..NET C ...

  10. linux安装mysql详细步骤

    最近买了个腾讯云服务器,搭建环境. 该笔记用于系统上未装过mysql的干净系统第一次安装mysql.自己指定安装目录,指定数据文件目录. linux系统版本: CentOS 7.3 64位 安装源文件 ...