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

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背包的分,好难受,有人过了的话和我说下呀。。。感谢感谢。。。。

 

原创粉丝点击