背包问题先记录一下
2016-03-05 09:40
323 查看
<span style="font-family: Arial, Helvetica, sans-serif;">#include "stdafx.h"</span>
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<queue> #include<climits> #include<cstring> using namespace std; const int c = 10; //背包的容量 const int w[] = { 0, 2, 2, 6, 5, 4 };//物品的重量,其中0号位置不使用 。 const int v[] = { 0, 6, 3, 5, 4, 6 };//物品对应的待加,0号位置置为空。 const int n = sizeof(w) / sizeof(w[0]) - 1; //n为物品的个数 int x[n + 1]; void package0_1(int m[][11], const int w[], const int v[], const int n)//n代表物品的个数 { //采用从底到顶的顺序来设置m[i][j]的值 //首先放w for (int j = 0; j <= c; j++) if (j < w ) m [j] = 0; //j小于w ,所对应的值设为0,否则就为可以放置 else m [j] = v ; //对剩下的n-1个物品进行放置。 int i; for (i = n - 1; i >= 1; i--) for (int j = 0; j <= c; j++) if (j < w[i]) m[i][j] = m[i + 1][j];//如果j < w[i]则,当前位置就不能放置,它等于上一个位置的值。 //否则,就比较到底是放置之后的值大,还是不放置的值大,选择其中较大者。 else m[i][j] = m[i + 1][j] > m[i + 1][j - w[i]] + v[i] ? m[i + 1][j] : m[i + 1][j - w[i]] + v[i]; } void answer(int m[][11], const int n) { int j = c; int i; for (i = 1; i <= n - 1; i++) if (m[i][j] == m[i + 1][j]) x[i] = 0; else { x[i] = 1; j = j - w[i]; } x = m[i][j] ? 1 : 0; } int main() { int m[6][11] = { 0 }; package0_1(m, w, v, n); for (int i = 0; i <= 5; i++) { for (int j = 0; j <= 10; j++) printf("%2d ", m[i][j]); cout << endl; } answer(m, n); cout << "The best answer is:\n"; for (int i = 1; i <= 5; i++) cout << x[i] << " "; system("pause"); return 0; }
转载 /article/3665226.html
相关文章推荐
- [唐诗]野望-王绩
- Caffe安装问题汇总
- 如何在程序中判断当前的qq空间图像是默认的空间图像------我现在已经不太喜欢严密的东东了
- Android在Fragment中使用Tab
- Java面试题之一对调两个数
- git完整教程
- Ranged-Based for loop vs. iterator
- 8款设计师常用漂亮的HTML CSS表格样式
- iOS、OC和Objective-C的区别
- Python核心教程(第二章)
- mybatis如何防止sql注入
- [唐诗]禅-虞世南
- 网线主管
- php中的file函数
- Spring Integration- EIP
- 修改导航条navigationBar和标签栏TabBar的里外颜色颜色(任何地方都能修改,但一般放在AppDelegate最好)
- 编程错误日常
- eclipse 两个真机,自动安装一个手机上,无手机选择画面
- Codeforces Round #344 (Div. 2) A 题题解 (暴力)
- php curl