http://www.hawstein.com/posts/dp-knapsack.html

http://www.cnblogs.com/wwwjieo0/archive/2013/04/01/2991238.html

http://blog.csdn.net/mu399/article/details/7722810

n颗宝石,体积v[i]  价值w[i] ,背包体积C

/**0-1 knapsack d(i, j)表示前i个物品装到剩余容量为j的背包中的最大重量**/
#include<cstdio>
using namespace std;
#define MAXN 1000
#define MAXC 100000 int V[MAXN], W[MAXN],x[MAXN];
int d[MAXN][MAXC]; int main(){
freopen("data.in", "r", stdin);///重定向输入流
freopen("data.out", "w", stdout);///重定向输出流
int n, C;
while(scanf("%d %d", &n, &C) != EOF){
for(int i=; i<n; ++i) scanf("%d %d", &V[i], &W[i]); for(int i=; i<=n; ++i){
for(int j=; j<=C; ++j){
d[i][j] = i== ? : d[i-][j];
if(i> && j>=V[i-])
d[i][j] =max(d[i-][j],d[i-][j-V[i-]]+W[i-]);
}
}
printf("%d\n", d[n][C]);///最终求解的最大价值 ///输出打印方案
int j = C;
for(int i=n; i>; --i){
if(d[i][j] > d[i-][j]){
x[i-] = ;
j = j - V[i-];///装入第i-1个宝石后背包能装入的体积就只剩下j - V[i-1]
}
}
for(int i=; i<n; ++i) printf("%d ", x[i]);///x[i]==1,即第i+1个放入
printf("\n");
} fclose(stdin);
fclose(stdout);
return ;
}

5 10
4 9
3 6
5 1
2 4
5 1
4 9
4 20
3 6
4 20
2 4
5 10
2 6
2 3
6 5
5 4
4 6

优化:

当一个问题找到一个放心可靠的解决方案后, 我们往往就要考虑一下是不是有优化方案了。
该算法的时间复杂度是O(nC), 即时间都花在两个for循环里了,这个应该是没办法再优化了。
再看看空间复杂度, 数组d用来保存每个状态的值,空间复杂度为O(nC);
数组V和W用来保存每个宝石的体积和价值,空间复杂度为O(n)。
程序总的空间复杂度为 O(nC),这个是可以进一步优化的。
首先,我们先把数组V和W去掉, 因为它们没有保存的必要,改为一边读入一边计算:

    int v=,w=;
for(int i=; i<=n; ++i){
if(i>)
scanf("%d%d",&v,&w);
for(int j=; j<=C; ++j){
d[i][j] = i== ? : d[i-][j];
if(i> && j>=v)
d[i][j] =max(d[i-][j],d[i-][j-v]+w);
}
}
printf("%d\n", d[n][C]);///最终求解的最大价值

空间优化2,空间复杂度仅为O(C)

#include<cstdio>
#include "cstdlib"
#include "cstring"
using namespace std;
#define MAXN 1000
#define MAXC 100000 int main(){
freopen("data.in", "r", stdin);///重定向输入流
freopen("data.out", "w", stdout);///重定向输出流
int n, C;
while(scanf("%d %d", &n, &C) != EOF){ int* d = (int*)malloc((C+)*sizeof(int));
memset(d, , (C+)*sizeof(int));
int v=,w=;
for(int i=; i<=n; ++i){
if(i>)
scanf("%d%d",&v,&w);
for(int j=C; j>=; j--){
if(i> && j>=v)
d[j] =max(d[j],d[j-v]+w);
}
}
printf("%d\n", d[C]);///最终求解的最大价值 } fclose(stdin);
fclose(stdout);
return ;
}

DP---背包问题的更多相关文章

  1. POJ 1417 True Liars(种类并查集+dp背包问题)

    题目大意: 一共有p1+p2个人,分成两组,一组p1,一组p2.给出N个条件,格式如下: x y yes表示x和y分到同一组,即同是好人或者同是坏人. x y no表示x和y分到不同组,一个为好人,一 ...

  2. HDU 1561 树形DP背包问题

    这是自己第一道背包上树形结构问题,不是很理解这个概念的可以先看看背包九讲 自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次AC了还是有点小激动的 题目大意是: 攻克m个城市,每 ...

  3. DP背包问题小总结

    DP的背包问题可谓是最基础的DP了,分为01背包,完全背包,多重背包 01背包 装与不装是一个问题 01背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每件物 ...

  4. DP背包问题学习笔记及系列练习题

    01 背包: 01背包:在M件物品中取出若干件物品放到背包中,每件物品对应的体积v1,v2,v3,....对应的价值为w1,w2,w3,,,,,每件物品最多拿一件. 和很多DP题一样,对于每一个物品, ...

  5. HDU 3127 WHUgirls dp背包问题

    WHUgirls Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  6. 记忆搜索与动态规划——DP背包问题

    题目描述 01背包问题 有n个重量和价值分别为\(w_i,v_i\)的物品.从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值中总和的最大值. 限制条件 1 <= n <= 10 ...

  7. dp背包问题

    0-1背包 1.问题定义: 给定n种物品和背包.物品i的重量是wi,价值是vi,每种物品只有一个,背包容量为C.问:应该如何选择装入背包的物品,使得装入背包中的物品总值最大. 2.算法思路: 选择装入 ...

  8. [poj 1947]树dp+背包问题

    题目链接:http://poj.org/problem?id=1947 看了很多题解都是直接一遍dfs就搞定的方法,但是我实在是没看懂那个转移方程.最后在茫茫博客中终于发现了一个有逻辑的方法,但是复杂 ...

  9. URAL 1108 简单的树形dp背包问题

    题目大意: 一颗苹果树上,每条边都对应了一个权值,最后留下包括root : 1在的含有 m 条边的子树 , 希望留下的子树中权值之和最大 这里保留m条边,我们可以看作是保留了 m + 1 个点 令dp ...

  10. 动态规划(DP)基础

    DP基础 简单dp 背包问题 记忆化搜索 简单dp 数字三角形 给一个数字构成的三角形,求从顶端走到底部的一条路径,使得路径上的和最大(或者最小). 1 2 3 6 5 4 Example_1 7 3 ...

随机推荐

  1. 4368: [IOI2015]boxes纪念品盒

    4368: [IOI2015]boxes纪念品盒 链接 分析 链接 代码 #include<bits/stdc++.h> using namespace std; typedef long ...

  2. P1215 [USACO1.4]母亲的牛奶 Mother's Milk

    P1215 [USACO1.4]母亲的牛奶 Mother's Milk 题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满 ...

  3. 使用TFS需要注意的地方

    1. 用管理员添加了本地映射,然后用其他用户就添加不了映射,一定要先用管理员账户去把映射 删除掉: 2. 在正式使用TFS时,一定需要在VS工具的设置里面,设置一下,签出时自动获取最新的代码.(默认是 ...

  4. fastlane自动化打包ipa并发布到firim或者蒲公英

    1.打开终端,确保Xcode Command Line Tools 安装了最新版 xcode-select --install 2.安装fastlane sudo gem install -n /us ...

  5. Gradle下载依赖jar包位置修改

    gradle会下载相关需要依赖的jar包,默认的本地存放地址是:C:/Users/(用户名)/.gradle/caches/modules-2/files-2.1,很多人和我一样不愿意放在C盘,所以需 ...

  6. APP功能性测试-3

    定义:兼容测试就是指软件在特定的硬件平台,不同的应用软件之间,不同的操作系统平台上,不同的网络等环境中是否能够正常的运行的测试  (会不会产生不兼容) 兼容性测试的作用 进一步提高产品质量 和其他软件 ...

  7. django中判断当前user具有是否有对模块的增删改查权限

    首先简单了解一下user的一些属性 User对象 User对象是认证系统的核心.用户对象通常用来代表网站的用户,并支持例如访问控制.注册用户.关联创建者和内容等.在Django认证框架中只有一个用户类 ...

  8. Spark集群管理器介绍

    Spark可以运行在各种集群管理器上,并通过集群管理器访问集群中的其他机器.Spark主要有三种集群管理器,如果只是想让spark运行起来,可以采用spark自带的独立集群管理器,采用独立部署的模式: ...

  9. Python音频处理(一)音频基础知识-周振洋

    1.声音音频基础知识 (1)声音是由震动产生,表现为波的形式.波有频率,振幅等参数.对于声波而言:频率越大,音调越高,反之越低.振幅越大,声音越大,反之越小. (2)采样率,帧率:波是连续(无穷)的, ...

  10. Truffle基础篇-Truffle做什么的?怎么安装?

    Truffle基础篇-Truffle做什么的?怎么安装? truffle资料汇总 http://truffle.tryblockchain.org/truffle3.0-integrate-nodej ...