动态规划(DP),0-1背包问题
题目链接:http://poj.org/problem?id=3624
1、p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解。
2、递推公式
p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]);
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define NUM 3410 //物品数量的上限
#define CAP 1300 //背包容量的上限 using namespace std; int w[NUM];//物品的重量
int v[NUM];//物品的价值
int p[NUM][CAP];//p[i][j]表示背包容量为j时,可选物品为i,i+1,...n时的01背包问题的最优解
//题意就是求p[1][c]; //递推表达式即为p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]);
//下面递推求出p[1][c];
void knapsack(int c,int n)//c为背包容量,n为物品的数量
{
//计算递推边界
int jMax=min(w[n]-,c);
for(int j=; j<=jMax; j++)
p[n][j]=;//第n个物品,这里都装不下
for(int j=w[n]; j<=c; j++)
p[n][j]=v[n];//第n个物品,这里都装得下
//开始递推计算到p[2][c];
for(int i=n-; i>; i--)
{
jMax=min(w[i]-,c);
for(int j=; j<=jMax; j++)
p[i][j]=p[i+][j];//装不下
for(int j=w[i]; j<=c; j++)
p[i][j]=max(p[i+][j],p[i+][j-w[i]]+v[i]);
}
p[][c]=p[][c];
if(c>=w[])
p[][c]=max(p[][c],p[][c-w[]]+v[]);
} void traceback(int c,int n,int x[])
{
for(int i=;i<n;i++)
{
if(p[i][c]==p[i+][c])
x[i]=;
else
{
x[i]=;
c=c-w[i];
}
}
x[n]=(p[n][c])?:;
} int main()
{
int memory[NUM];
int C,N;///C为容量,N为物品个数
while(scanf("%d%d",&N,&C)!=EOF)
{
memset(p,,sizeof(p));
for(int i=; i<=N; i++)
{
scanf("%d",&w[i]);
scanf("%d",&v[i]);
}
knapsack(C,N);
printf("%d\n",p[][C]);
traceback(C,N,memory);
for(int i=;i<=N;i++)
printf("%d ",memory[i]);
return ;
}
}
但是,很遗憾,Runtime Error
这里可以转化为一维DP
p[i]表示背包容量为i 时的最优解
memset(p,0,sizeof(p));
然后遍历所有物品,更新p
递推公式:
for(int i=;i<=n;i++)
{
for(int j=W;j>=;j--)
{
if(j>w[i]&&p[j-w[i]]+val[i]>p[j])
p[i]=p[j-w[i]]+val[i];
}
}
Source Code
#include <stdio.h>
#include <string.h>
#define N 3500 ///物品数量上限
#define M 13000///背包容量上限 int w[N];///物品重量
int val[N];///物品价值
int p[M];///p[i]表示背包容量为i时的最优解
int n;///物品个数
int W;///背包容量 ///求p[W];
void knapsack()
{
int i,j;
memset(p,,sizeof(p));
for(i=;i<=n;i++)
{
for(j=W;j>=;j--)
{
///当前第i个物品装得下,而且比不装要优
if(j>=w[i]&&p[j-w[i]]+val[i]>p[j])
p[j]=p[j-w[i]]+val[i];
}
}
return ;
} int main()
{
int i;
while(scanf("%d%d",&n,&W)!=EOF)
{
for(i=;i<=n;i++)
scanf("%d%d",&w[i],&val[i]);
knapsack();
printf("%d\n",p[W]);
}
return ;
}
动态规划(DP),0-1背包问题的更多相关文章
- hdu2602Bone Collector ——动态规划(0/1背包问题)
Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...
- 0/1背包问题(DP)
Description 给定 n 个物品和一个背包.物品 i 的重量是 wi ,其价值为 vi ,背包的容量为 C .问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? Input 输入 ...
- 算法-动态规划DP小记
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...
- 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...
- 蓝桥杯 0/1背包问题 (java)
今天第一次接触了0/1背包问题,总结一下,方便以后修改.不对的地方还请大家不啬赐教! 上一个蓝桥杯的例题: 数据规模和约定 代码: import java.util.Scanner; public ...
- 动态规划:HDU1059-Dividing(多重背包问题的二进制优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 2084 数塔 (动态规划DP)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目分析:此题采用动态规划自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后一排 ...
- 动态规划dp
一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...
- [JL]最后的晚餐 动态规划(DP) codevs5318
[JL]最后的晚餐 TimeLimit:1000MS MemoryLimit:1000KB 64-bit integer IO format:%lld Problem Description [题库 ...
- Jury Compromise---poj1015(动态规划,dp,)
题目链接:http://poj.org/problem?id=1015 大致题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n 个人作为陪审团的候 ...
随机推荐
- Python学习 day05
数据类型划分 数据类型可分为:可变数据类型,不可变数据类型 不可变数据类型:bool.int.str.元祖 -- 不可变数据类型又称为可哈希的 可变数据类型:list.dict.se ...
- 理解fig,ax = plt.subplots()
fig = plt.figure() ax = fig.add_subplot(1,1,1) fig, ax = plt.subplots(1,3),其中参数1和3分别代表子图的行数和列数,一共有 1 ...
- Mac下Jenkins+SVN+Xcode构建持续导出环境
1 安装Jenkins Jenkins是基于Java开发的一种持续集成工具.所以呢,要使用Jenkins必须使用先安装JDK. JDK安装 JDK 下载地址 jdk 1.8.png 安装JDK的过程略 ...
- apache CXF quickstart
1下载 官网: cxf.apache.org 下载 CXF 的开发包: 解压上面的 zip 文件 : 2介绍 1什么是cxf Apache CXF™ is an open source service ...
- React.js 小书 Lesson8 - 组件的组合、嵌套和组件树
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson8 转载请注明出处,保留原文链接和作者信息. 继续拓展前面的例子,现在我们已经有了 Heade ...
- ebiao 报表工具使用入门
一.ebiao简价 e表是一个功能强大的Web报表工具,可使复杂报表的设计简单化,避免了大量的复杂SQL编写以及编程来准备数据,报表设计的效率大大提高.e表分为e表 for .NET和e表 for J ...
- SQLAlchemy基本操作和常用技巧
点击打开链接 Python的ORM框架SQLAlchemy基本操作和常用技巧,包含大量实例,非常好的一个学习SQLAlchemy的教程,需要的朋友可以参考下 python编程语言下的一款开源软件.提供 ...
- 深入理解JavaScript系列(35):设计模式之迭代器模式
介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 迭代器的几个特点是: 1.访问一个聚合对象的内容而无需暴露它的内部表示. 2.为遍历不同的集合 ...
- 什么是图像 -- opencv基础
opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像: ...
- MVC 下拉框获取值和赋值(多选)
1.视图 <div class="form-group"> @Html.LabelFor(m => m.Positions, new { @class = &qu ...