/*背包问题:
背包所能容纳重量为10;共五件商品,商品重量用数组m存储m[5]={2,2,6,5,4},
每件商品的价值用数组n存储,n[5]={6,3,5,4,6};求背包所能装物品的最大价值。
*/
#include<stdio.h>
#include<conio.h>
int main() {
int m[] = { ,,,, }, n[] = { ,,,, };
int flag[] = { ,,,, };//符号标志位,表示地某个点是否装入背包,装入为1,未装入为0;
int i, j, k;
int c = , sum1 = , sum2 = ;//sum1表示最终背包容纳的重量。sum2表示最终背包中容纳的最大价值的价值。
//设一个二维数组,横坐标表示所装物品的标号,纵坐标表示背包所容纳的最大重量0~10;
int mn[][];
for (i = ; i >= ; i--) {//二维数组从下至上
for (j = ; j <= ; j++) {
if (i == ) {
if (m[i]>j)
mn[i][j] = ;
else
mn[i][j] = n[i];
}
else {
if (m[i]>j) {
mn[i][j] = mn[i + ][j];
}
else {
mn[i][j] = mn[i + ][j]>mn[i + ][j - m[i]] + n[i] ? mn[i + ][j] : mn[i + ][j - m[i]] + n[i];
}
}
}
} for (i = ; i<; i++) {
if (mn[i][c] != mn[i + ][c]) {//从二维数组上方开始,背包最大值c,mn[i][c]的值若与mn[i+1][c]的值不同,则m[i]未放入背包中(之前是自下往上放的)
flag[i] = ;
c = c - m[i];//若放入背包,则背包可容纳总重量减少;
}
printf("%d ", flag[i]);
}//输出所放入的物品序号 for (i = ; i<; i++) {
if (flag[i] == ) {
sum1 += m[i];
sum2 += n[i];
}
}
printf("\n背包容纳的重量为:%d 背包容纳的总价值为:%d", sum1, sum2); getch();
return ;
}

最新文章

  1. Nancy之大杂烩
  2. ubuntu一些基本软件安装方法
  3. 观察者模式(Observer pattern)
  4. CentOS下安装keepalived 进行服务器热备
  5. 面向对象的 JavaScript
  6. Java之网络请求工具类(依赖:org.apache.http;注:HttpClient 4.4,HttpCore 4.4)
  7. 为什么我们不喜欢用富UI控件
  8. 【Daily】 2014-4-23
  9. HTTP请求过程(http是一种无状态协议,即不建立持久的连接)
  10. Vue学习5:条件渲染
  11. 吴裕雄 python 机器学习-DMT(1)
  12. 003.FTP客户端连接
  13. 【ArcGIS】ArcGIS Data Store配置
  14. jmeter+maven 的简单使用 记录(Windows环境)
  15. visio2013 激活工具,仅供交流学习
  16. PHP-----PHP程序设计基础教程----第二章PHP基本语法
  17. SPOJ104 Highways 【矩阵树定理】
  18. 初步探究ES6之箭头函数
  19. mysql中的一些操作
  20. 【整理】C++中的unique函数

热门文章

  1. 查看JVM参数
  2. vue学习笔记3: 动态绑定
  3. idea中当前模块资源目录上显示属于其他模块
  4. 基于Bootstrap和Knockout.js的ASP.NET MVC开发实战 关于 拦截器的 学习 部分
  5. allegro设置内存分配器的一个坑
  6. 解决虚拟机中Linux不能上网的问题
  7. java线程基础梳理
  8. SpringCloud与微服务Ⅱ --- 微服务概述
  9. Promise函数的使用
  10. mysql 基本常用语句