首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >动态规划——背包问题(c语言)

动态规划——背包问题(c语言)

作者头像
全栈程序员站长
发布2022-09-06 10:16:58
发布2022-09-06 10:16:58
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript
代码运行次数:0
运行
复制
/*背包问题:
背包所能容纳重量为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;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154547.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档