动态规划(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 个人作为陪审团的候 ...
随机推荐
- MySQL Flashback 闪回功能详解
1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带wh ...
- Blockly
Blockly简介 A library for building visual programming editors. Blockly 是个库,可用来构建可视化编程编辑器 Blockly is b ...
- 剑指offer第3题:从尾到头打印链表
方法一:采用栈来存储,用ArrayList保存.注意题目给出的输出结果是ArrayList import java.util.ArrayList; import java.util.Stack; pu ...
- Enjoy coding
Enjoy coding iTerm配置 主题选择 Solarized Dark LiquidCarbon 字体选择 Cousine for Powerline(需要安装Powerline字体库), ...
- 吴恩达《Machine Learning Yearning》总结(31-40章)
31.解读学习曲线:其他情况 下图反映了高方差,通过增加数据集可以改善. 下图反映了高偏差和高方差,需要找到一种方法来同时减少方差和偏差. 32.绘制学习曲线 情况:当数据集非常小时,比如只有100个 ...
- node.js mysql 使用总结
npm install mysql 使用mysql连接池 let mysql = require('mysql'); let db_config = { "connectionLimit&q ...
- div内容溢出
前几天遇到一个问题,代码是这样一个层次: <div class="province"> <ul> <li>1</li> <li ...
- (一)初识div+css
关于div+css,一直以来都是听其名,而不知其为何.今天看了半天的视频,终于对此略有了解,感觉挺好的,相比之前的table布局页面,div+css就是一把页面布局利器!! div全称division ...
- Java Web基础——Action+Service +Dao三层的功能划分 (转载)
原文:https://blog.csdn.net/inter_peng/article/details/41021727 仅供自己学习使用: 1. Action/Service/DAO简介: Acti ...
- kafka基本机制
Kafka目前主要作为一个分布式的发布订阅式的消息系统使用,下面简单介绍一下kafka的基本机制 1.3.1 消息传输流程 Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息 ...