算法设计与分析 头哥educoder 01背包

这篇博客探讨了算法设计与分析中的01背包问题,介绍了如何在给定容量的背包中选择物品以最大化总价值。通过输入物品数量、重量和价值,以及背包的容量,利用动态规划求解能携带物品的最大价值。例如,对于输入样例5个物品和背包容量13,物品重量和价值分别为(3, 4, 4, 5, 10)和(2, 9, 9, 10, 24),输出的最大价值为28。" 126178837,7522091,使用ZeroMQ和ROS实现消息传递,"['ROS', 'ZeroMQ', '网络编程', '通信']
摘要由CSDN通过智能技术生成

 有n个重量分别为w={w_1,w_2,…,w_n}的物品,他们的价值分别为v={v_1,v_2,…,v_n},给定一个容量为V的背包。 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,并且背包内物品的总价值达到最大。

输入格式 第一行输入两个整数n、G,其中n表示物品的数量,G表示背包的容量体积。 第二行输入n个整数,整数间以空格分隔,表示n个物品的重量w_i 第三行输入n个整数,整数间以空格分隔,表示n个物品的价值v_i

输出格式 一个实数,表示能携带物品的最大价值。

输入样例 5 13 3 4 4 5 10 2 9 9 10 24

输出样例 28

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, c;
    scanf("%d %d", &n, &c);

    int* weight = (int*)malloc((n + 1) * sizeof(int));
    int* value = (int*)malloc((n + 1) * sizeof(int));

    weight[0] = 0;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &weight[i]);
    }

    value[0] = 0;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &value[i]);
    }

    int** v = (int**)malloc((n + 1) * sizeof(int*));
    for (int i = 0; i <= n; i++) {
        v[i] = (int*)malloc((c + 1) * sizeof(int));
    }

    for (int i = 0; i <= n; i++) {
        v[i][0] = 0;
    }
    for (int j = 0; j <= c; j++) {
        v[0][j] = 0;
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= c; j++) {
            if (j < weight[i]) {
                v[i][j] = v[i - 1][j];
            } else {
                v[i][j] = (v[i - 1][j] > v[i - 1][j - weight[i]] + value[i]) ? v[i - 1][j] : v[i - 1][j - weight[i]] + value[i];
            }
        }
    }

    printf("%d\n", v[n][c]);


    return 0;
}
5 13
3 4 4 5 10
2 9 9 10 24

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值