http://poj.org/problem?id=3624

题目大意:贝茜去了商场的珠宝店,发现了一个迷人的手镯。当然,她想装最好的魅力(N(1≤N≤3402)可用的魅力)。每个魅力提供的列表中都有一个重量Wi(1≤Wi≤400),一个“愿望”因素Di(1≤Di≤100),最多可以使用一次。贝茜只能支持一个重量不超过M的魅力手镯。

*第1行:两个空格分隔的整数:N和M。

*第2 …N+1行:第i+1行描述了具有两个空间分离整数的魅力i: Wi和Di。考虑到重量限制作为一种约束,并列举了它们的重量和可取性的魅力,推断出魅力最大可能的取值。

也就是说,这个问题是01背包问题,设x[ i ]为1表示第i个珠宝放入手链,为0则不放入,那么原问题就变成了求 约束条件是 , 我们可以采用动态规划,回溯法,分支限界法等来解决该问题。这里采用动态规划求解。

算法思想:动态规划

a) 把背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选),Di表示第 i 个物品的价值,Wi表示第 i 个物品的体积(重量);

b) 建立模型,即求max(D1X1+D2X2+…+DnXn);

c) 约束条件,W1X1+W2X2+…+WnXn<=M;

d) 定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值;

e) 最优性原理是动态规划的基础,最优性原理是指“多阶段决策过程的最优决策序列具有这样的性质:不论初始状态和初始决策如何,对于前面决策所造成的某一状态而言,其后各阶段的决策序列必须构成最优策略”。判断该问题是否满足最优性原理,采用反证法证明:

假设(X1,X2,…,Xn)是01背包问题的最优解,则有(X2,X3,…,Xn)是其子问题的最优解,

假设(Y2,Y3,…,Yn)是上述问题的子问题最优解,则理应有(D2Y2+D3Y3+…+DnYn)+D1X1 > (D2X2+D3X3+…+DnXn)+D1X1;

而(D2X2+D3X3+…+DnXn)+D1X1=(D1X1+D2X2+…+DnXn),则有(D2Y2+D3Y3+…+DnYn)+D1X1 > (D1X1+D2X2+…+DnXn);

该式子说明(X1,Y2,Y3,…,Yn)才是该01背包问题的最优解,这与最开始的假设(X1,X2,…,Xn)是01背包问题的最优解相矛盾,故01背包问题满足最优性原理;

f) 寻找递推关系式,面对当前商品有两种可能性:

第一,背包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);

第二,还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{ V(i-1,j),V(i-1,j-W(i))+D(i) }

其中V(i-1,j)表示不装,V(i-1,j-W(i))+D(i) 表示装了第i个商品,背包容量减少W(i)但价值增加了v(i);

由此可以得出递推关系式:

1) j<W(i)      V(i,j)=V(i-1,j)

2) j>=W(i)     V(i,j)=max V(i-1,j)V(i-1,j-W(i))+D(i)

到此便能解决,但是你会发现,这样提交空间会溢出,不满足,所以我们要对其进行空间优化。

g) 空间优化,每一次V(i)(j)改变的值只与V(i-1)(x) {x:1...j}有关,V(i-1)(x)是前一次i循环保存下来的值;

因此,可以将V缩减成一维数组,从而达到优化空间的目的,状态转移方程转换为 result(j)= max{result(j), result(j-W(i))+D(i)}

并且,状态转移方程,每一次推导V(i)(j)是通过V(i-1)(j-w(i))来推导的,所以一维数组中j的扫描顺序应该从大到小(M到0),否者前一次循环保存下来的值将会被修改,从而造成错误。

h) 然而不足的是,虽然优化了动态规划的空间,但是该方法不能找到最优解的解组成,因为动态规划寻找解组成一定得在确定了最优解的前提下再往回找解的构成,而优化后的动态规划只用了一维数组,之前的数据已经被覆盖掉,所以没办法寻找,所以两种方法各有其优点。但是这样提交可以通过。

 #include <iostream>
using namespace std;
#define MAXN 3403
#define MAXM 12881
int w[MAXN];
int d[MAXN];
int result[MAXM];
int main()
{
int N;
int M;
cin >> N >> M; for (int i = ; i <= N; i++)
{
cin >> w[i] >> d[i];
}
for (int tempN = ; tempN <= N; ++tempN) //对第tempN个物品
{
for (int tempM = M; tempM >= w[tempN]; tempM--)//背包容量从大到小
{
if (result[tempM] <= result[tempM - w[tempN]] + d[tempN])//比较装与不装的价值
{
result[tempM] = result[tempM - w[tempN]] + d[tempN]; //二维变一维
}
}
}
cout << result[M] << endl; return ;
}

poj3624 Charm Bracelet的更多相关文章

  1. Poj3624 Charm Bracelet (01背包)

    题目链接:http://poj.org/problem?id=3624 Description Bessie has gone to the mall's jewelry store and spie ...

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

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

  3. POJ3624 Charm Bracelet 【01背包】

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22621   Accepted: 10157 ...

  4. poj3624 Charm Bracelet(DP,01背包)

    题目链接 http://poj.org/problem?id=3624 题意 有n个手镯,每个手镯有两个属性:重量W,需求因子D.还有一个背包,它能装下总重量不超过M的手镯.现在将一些镯子装入背包,求 ...

  5. Charm Bracelet(01背包问题)

    题目链接: https://vjudge.net/problem/POJ-3624 题目描述: Bessie has gone to the mall's jewelry store and spie ...

  6. POJ 3624 Charm Bracelet(01背包)

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

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

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

  8. Charm Bracelet

    Charm Bracelet Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  9. D - Charm Bracelet 背包问题

      Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Pra ...

随机推荐

  1. JDK 泛型之 Type

    JDK 泛型之 Type 一.Type 接口 JDK 1.5 引入 Type,主要是为了泛型,没有泛型的之前,只有所谓的原始类型.此时,所有的原始类型都通过字节码文件类 Class 类进行抽象.Cla ...

  2. oracle 新建数据库 ,新建用户

    net manager   数据库名----电脑名localhost 1521  , 服务名  orcl (oracle 版本不一样, 不同版本不一样,,)  然后测试.. sys 账号登录  新建用 ...

  3. cubieboard网络设置

    1.1 配置静态ip vi /etc/network/interface auto lo iface lo inet loopback #以下是添加的内如 auto eth0 #iface eth0 ...

  4. 【JAVA】通过URLConnection/HttpURLConnection发送HTTP请求的方法(一)

    Java原生的API可用于发送HTTP请求 即java.net.URL.java.net.URLConnection,JDK自带的类: 1.通过统一资源定位器(java.net.URL)获取连接器(j ...

  5. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  6. 如何优化Mysql数据库

    1.添加主键ID 2.尽量避免使用select * form table 3.创建索引     对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或 ...

  7. 2018.08.19 NOIP模拟 dp(二分+状压dp)

    Dp 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 一块土地有 n 个连续的部分,用 H[1],H[2],-,H[n] 表示每个部分的最初高度.有 n 种泥土可用,他们都能覆盖连续 ...

  8. 2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)

    传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...

  9. Java基础知识学习笔记(一)

    理解面向对象: Java纯粹的面向对象的程序设计语言,主要表现为Java完全支持面向对象的三个基本特征:继承.封装.多态. Java程序的最小单位是类,类代表客观世界中具有某种特征的一类事物,这些类可 ...

  10. 状态机中的RAM注意的问题--减少扇出的办法

    可能我不会抓紧时间,所以做事老是很慢.最近在整维特比译码过程深感自己有这样的毛病. 每天会有一点进展,但是却是一天的时间,感觉别人都做起事情来很快.可能这个东西有点难,做 不做得出来都不要紧,但我的想 ...