动态规划------背包问题(c语言)
2024-09-06 18:02:12
/*背包问题:
背包所能容纳重量为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 ;
}
最新文章
- Nancy之大杂烩
- ubuntu一些基本软件安装方法
- 观察者模式(Observer pattern)
- CentOS下安装keepalived 进行服务器热备
- 面向对象的 JavaScript
- Java之网络请求工具类(依赖:org.apache.http;注:HttpClient 4.4,HttpCore 4.4)
- 为什么我们不喜欢用富UI控件
- 【Daily】 2014-4-23
- HTTP请求过程(http是一种无状态协议,即不建立持久的连接)
- Vue学习5:条件渲染
- 吴裕雄 python 机器学习-DMT(1)
- 003.FTP客户端连接
- 【ArcGIS】ArcGIS Data Store配置
- jmeter+maven 的简单使用 记录(Windows环境)
- visio2013 激活工具,仅供交流学习
- PHP-----PHP程序设计基础教程----第二章PHP基本语法
- SPOJ104 Highways 【矩阵树定理】
- 初步探究ES6之箭头函数
- mysql中的一些操作
- 【整理】C++中的unique函数