0-1背包问题
来源:互联网 发布:c语言主函数的格式 编辑:程序博客网 时间:2024/06/01 08:10
题目内容:
背包最大允许装载为C, 有n个物品要放进背包,每个物品的重量为w[1],w[2],...w[n],每个物品的价值为v[1],v[2],...v[n], 请选择物品装进背包,使得价值最大。C为整数。
输入描述
第一行为物体个数n,以及背包容量C;
第二行为n个重量(实数),空格隔开
第三行为n个价值(实数),空格隔开
输出描述
第一行为最大装载的总价值
第二行为每个物品是否装载,1表示装,0表示不装,中间用空格隔开
(测试数据能保证最优解唯一)
输入样例
5 10
2 2 6 5 4
6 3 5 4 6
输出样例
15
背包最大允许装载为C, 有n个物品要放进背包,每个物品的重量为w[1],w[2],...w[n],每个物品的价值为v[1],v[2],...v[n], 请选择物品装进背包,使得价值最大。C为整数。
输入描述
第一行为物体个数n,以及背包容量C;
第二行为n个重量(实数),空格隔开
第三行为n个价值(实数),空格隔开
输出描述
第一行为最大装载的总价值
第二行为每个物品是否装载,1表示装,0表示不装,中间用空格隔开
(测试数据能保证最优解唯一)
输入样例
5 10
2 2 6 5 4
6 3 5 4 6
输出样例
15
1 1 0 0 1
启迪:一开始很快写出来了,测试数据也过了,但是一直wa,气得我再也没碰DP了,昨天晚上写28.快乐 的时候用了新方法,也没搞出来,今天上午突然发现原来是matrix数组的空间不够,我也是日了狗。。。
#include <iostream>#include <string.h>using namespace std;int N;int C;int weight[30];int value[30];int totalvalue[30][200];void Init(){int i, j;for(i = 1; i <= N; i++){for(j = 1; j <= C; j++){if(j < weight[i])totalvalue[i][j] = totalvalue[i - 1][j];else{totalvalue[i][j] = totalvalue[i - 1][j] > totalvalue[i - 1][j - weight[i]] + value[i] ? totalvalue[i - 1][j] : totalvalue[i - 1][j - weight[i]] + value[i];}} }}int main(void){int i, dig[20], j;//数据的初始化 cin>>N>>C;for(i = 1; i <= N; i++)cin>>weight[i];for(i = 1; i <= N; i++)cin>>value[i];memset(totalvalue, 0, sizeof(totalvalue));Init();cout<<totalvalue[N][C]<<endl;j = C;for(i = N; i >= 1; i--){if(totalvalue[i][j] == totalvalue[i - 1][j])dig[i] = 0;else{dig[i] = 1;j -= weight[i];}}for(i = 1; i <= N; i++)cout<<dig[i]<<" ";return 0;}公式想清楚,就是很不错的了,另外就是我这里是从1开始放东西的,也比较符合常识,附上一个漫画链接,教你快速入门DP
: http://note.youdao.com/noteshare?id=b31d5b3b5fda03402023d6bb303f0f17
另外:最好做一下 28.快乐, http://blog.csdn.net/u010862301/article/details/40691321 这道题, 反向推出物品放或者不放,但是由于题目不一样,我改进后反向推到0-1背包时候只是过了测试数据,不能得到0-1背包的分,好难受,有人过了的话和我说下呀。。。感谢感谢。。。。
阅读全文
0 0
- 背包问题(0-1背包、完全背包、多重背包)详解
- 背包问题和0-1背包问题
- 背包问题和0-1背包问题
- 背包问题系列--"0-1背包问题"
- 背包笔记-含0/1背包问题、完全背包问题、多重背包问题、二维背包问题、分组背包问题
- 【背包问题】背包问题之0-1背包、完全背包、多重背包
- 0-1背包问题
- 0/1背包问题
- 0,1背包问题
- 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- // 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- 0-1背包问题
- 0-1背包问题
- 0/1背包问题
- 问答专场 | 我是蝉游记创始人纯银V,你有什么想问我?
- Markdown系列(8)- Markdown编辑器和常见的富文本编辑器有什么区别
- test jdbc properties
- 1027. 打印沙漏(20)
- 智能投顾 线下沙龙笔记
- 0-1背包问题
- Java基础知识(上)
- Android Studio 3.1 Preview DexArchiveBuilderException
- leetcode_492. Construct the Rectangle ? 待解决
- 2015年读书总结
- 由盛而衰的O2O,在明年还能笑傲江湖吗?
- Spring定时任务的几种实现(转)
- PMCAFF产品经理第一课 | 深圳站 现场集锦
- 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。