背包算法是一种经典的动态规划算法,用于解决背包问题。背包问题是指有一个背包,容量为C,有n个物品,每个物品重量为w[i],价值为v[i],求在不超过背包容量的情况下,能够获得的最大价值。以下是C语言实现背包算法的代码。

#include <stdio.h>

#define N 5    // 物品个数
#define C 10   // 背包容量

int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int w[N] = {2, 2, 6, 5, 4};   // 每个物品的重量
    int v[N] = {6, 3, 5, 4, 6};   // 每个物品的价值
    int f[N + 1][C + 1];          // f[i][j]表示前i个物品装入容量为j的背包中所能获得的最大价值
    int i, j;

    // 初始化
    for (i = 0; i <= N; i++) {
        for (j = 0; j <= C; j++) {
            f[i][j] = 0;
        }
    }

    // 动态规划
    for (i = 1; i <= N; i++) {
        for (j = 1; j <= C; j++) {
            if (j < w[i - 1]) {
                f[i][j] = f[i - 1][j];
            } else {
                f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i - 1]] + v[i - 1]);
            }
        }
    }

    // 输出结果
    printf("最大价值为:%d\n", f[N][C]);

    return 0;
}

该代码中,我们使用一个二维数组f来记录前i个物品装入容量为j的背包中所能获得的最大价值。在初始化时,将f数组全部初始化为0。接着,使用两个循环依次计算每个状态f[i][j],并根据状态转移方程更新f数组。最后,输出f[N][C]即为所求的最大价值。

需要注意的是,数组下标从0开始,因此第i个物品的重量和价值分别为w[i-1]和v[i-1]。

C语言实现背包算法:动态规划解题

原文地址: https://www.cveoy.top/t/topic/oiAu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录