动态规划------背包问题(c语言)
/*背包问题: 背包所能容纳重量为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[5] = { 2,2,6,5,4 }, n[5] = { 6,3,5,4,6 }; int flag[5] = { 0,0,0,0,0 };//符号标志位,表示地某个点是否装入背包,装入为1,未装入为0; int i, j, k; int c = 10, sum1 = 0, sum2 = 0;//sum1表示最终背包容纳的重量。sum2表示最终背包中容纳的最大价值的价值。 //设一个二维数组,横坐标表示所装物品的标号,纵坐标表示背包所容纳的最大重量0~10; int mn[5][11]; for (i = 4; i >= 0; i--) {//二维数组从下至上 for (j = 0; j <= 10; j++) { if (i == 4) { if (m[i]>j) mn[i][j] = 0; else mn[i][j] = n[i]; } else { if (m[i]>j) { mn[i][j] = mn[i + 1][j]; } else { mn[i][j] = mn[i + 1][j]>mn[i + 1][j - m[i]] + n[i] ? mn[i + 1][j] : mn[i + 1][j - m[i]] + n[i]; } } } } for (i = 0; i<5; i++) { if (mn[i][c] != mn[i + 1][c]) {//从二维数组上方开始,背包最大值c,mn[i][c]的值若与mn[i+1][c]的值不同,则m[i]未放入背包中(之前是自下往上放的) flag[i] = 1; c = c - m[i];//若放入背包,则背包可容纳总重量减少; } printf("%d ", flag[i]); }//输出所放入的物品序号 for (i = 0; i<5; i++) { if (flag[i] == 1) { sum1 += m[i]; sum2 += n[i]; } } printf("\n背包容纳的重量为:%d 背包容纳的总价值为:%d", sum1, sum2); getch(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了