动态规划(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 个人作为陪审团的候 ...
随机推荐
- javascript中构造函数与普通函数的区别还有关于“new”操作符的一些原理
有一种创建对象的方法叫做工厂模式,例如: function person(name,age){ var o=new Object(); o.name=name; o.age=age; return o ...
- CSAPP阅读笔记-32位64位的区别--来自第三章引言的笔记--P110
仅从寻址上看,32位和64位机器能寻址的内存空间大小不同. 需要知道的是,计算机系统对存储器作了抽象,程序“认为”内存是一个很大的字节数组,然而实际上它是由多个硬件存储器和操作系统组合起来实现的. 程 ...
- 引导篇之web结构组件
web结构组件有如下几种: 代理 HTTP代理服务器,是Web安全.应用集成以及性能优化的重要组成模块.代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求 ...
- ReactJS 页面跳转保存当前scrollTop回来时,自动移动到上次浏览器的位置
在移动端的操作的时候,相信大家都遇到到这种情况,翻了好几页了,点击一项进去查,然后回来的时候,还想回来我原来的位置. google上也找了一此,有一个组件,但是好像是如果想实现这个功能,页面就得用那个 ...
- 023-将表单序列化为json对象
使用jQuery将表单序列化为json对象,其中serializeJson方法的名字任意,serializeArray()这个jQuery提供的方法.this指的就是谁调用了这个方法. $.fn.se ...
- mongodb常用语句(集合操作)
mongodb常用语句(集合操作) 查看集合帮助 db.songs.help(); 查看集合总数据量 db.songs.count(); 查看表空间大小 db.songs.dataSize(); 查看 ...
- [html/js]点击标题出现下拉列表
效果 初始 点击后 参考代码 <!DOCTYPE html> <html> <head> <title>Layer group example</ ...
- ionic 打包安卓包 (debug调试版和 release发布版)
一.配置环境: 先按照之前的文章,配置好环境需要: 安装jdk,配置环境变量:( http://www.cnblogs.com/loveyaxin/p/7520618.html) 安装android- ...
- 自己用 python 实现 base64 编码
自己用 python 实现 base64 编码 base64 编码原理 二进制文件中包含有很多无法显示和打印的字符,二进制的数据一般以 ASCII 码形式(8 bit,即一个字节)存储,8 bit 可 ...
- springboot整合rabbitmq,支持消息确认机制
安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...