背包问题(1)
来源:互联网 发布:seo基础理论 编辑:程序博客网 时间:2024/05/24 02:18
问题描述: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
//时间:O(VN)空间:O(OVN)#include<iostream>#include<algorithm>using namespace std;int main(){ int goodsnum, colum; cin >> goodsnum >> colum; //申请数组 int *value = new int[goodsnum + 1]; int *weight = new int[goodsnum + 1]; for (int i = 1; i <= goodsnum; ++i) cin >> weight[i] >> value[i]; int **f = new int *[goodsnum + 1]; for (int i = 0; i <= goodsnum; ++i) f[i] = new int[colum + 1]; //初始化 for (int i = 0; i <= goodsnum; ++i) { for (int j = 0; j <= colum; ++j) { f[i][j] = 0; } } //计算 for (int i = 1; i <= goodsnum; ++i) { for (int j = 1; j <= colum; ++j) { if (j >= weight[i]) f[i][j] = max(f[i - 1][j], f[i - 1][j - weight[i]] + value[i]); else f[i][j] = f[i - 1][j]; } //输出 for (int j = 0; j <= colum; ++j) cout << f[i][j] << " "; cout << endl; } system("pause"); //释放空间 delete[]value; delete[]weight; for (int i = 0; i <= goodsnum; ++i) delete[]f[i]; delete[]f; return 0;}
//时间:O(VN)空间:O(V)#include<iostream>#include<algorithm>using namespace std;int main(){ int goodsnum, colum; cin >> goodsnum >> colum; int *value = new int[goodsnum+1]; int *weight = new int[goodsnum+1]; //输入 for (int i = 1; i <= goodsnum; ++i) cin >> weight[i] >> value[i]; int *f = new int[colum + 1]; //初始化 for (int i = 0; i <= colum; ++i) { f[i] = 0; } for (int i = 1; i <= goodsnum; ++i) { //计算 for (int j = colum; j >=weight[i]; --j) { f[j] = max(f[j], f[j - weight[i]]+value[i]); } //输出 for (int j = 0; j <= colum; ++j) cout << f[j] << " "; cout << endl; } system("pause"); delete[]value; delete[]weight; delete[]f; return 0;}
//时间:O(VN)空间:O(V)#include<iostream>#include<algorithm>using namespace std;//单件商品01背包过程void ZeroOnepack_goods(int cost, int value, int Colum, int *f){ for (int i = Colum; i >= cost; --i) f[i] = max(f[i], f[i - cost] + value);}//01背包问题void ZeroOnePack(int *cost, int *value, int Num, int Colum,int *f){ for (int i = 1; i <= Num; ++i) { ZeroOnepack_goods(cost[i], value[i], Colum, f); }}int main(){ int goodsnum, colum; cin >> goodsnum >> colum; int *value = new int[goodsnum + 1]; int *weight = new int[goodsnum + 1]; //输入 for (int i = 1; i <= goodsnum; ++i) cin >> weight[i] >> value[i]; int *f = new int[colum + 1]; //初始化 memset(f, 0, sizeof(int)*(colum + 1));//将数组f[]全置0 ZeroOnePack(weight, value, goodsnum, colum, f); cout << f[colum] << endl; system("pause"); delete[]value; delete[]weight; delete[]f; return 0;}
阅读全文
0 0
- 背包问题1:01背包
- 背包问题《1》01背包
- 背包问题(0-1背包、完全背包、多重背包)详解
- 背包问题和0-1背包问题
- 背包问题和0-1背包问题
- 背包问题系列--"0-1背包问题"
- 背包笔记-含0/1背包问题、完全背包问题、多重背包问题、二维背包问题、分组背包问题
- 背包问题(1)——01背包、完全背包、多重背包、混合三种背包问题
- 【背包问题】背包问题之0-1背包、完全背包、多重背包
- 0-1背包问题
- 0/1背包问题
- 0,1背包问题
- 背包问题 1
- 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- // 0-1背包问题
- 0/1背包问题
- C/C++ 第三周线性表项目四(1) 顺序表应用
- Delphi菜单栏背景色-转载收藏学习
- 树莓派3-Jessie编译安装ROS-indigo完整版
- CAN总线学习笔记:CAN总线的相关概念
- codis集群部署
- 背包问题(1)
- android studio无线调试
- 研究区分onbeforeunload事件是刷新还是关闭
- JS时间戳与时间的转换总结
- 我的CET-6准备之路(每天更新中...)
- 前后端数据交互之前端传值到后台
- 你知道谷歌有个社区叫 GBG 么?
- 第八周(2) 项目3.2-稀疏矩阵的三元组表示的实现及应用
- Butterknife使用