C语言实现背包算法:动态规划解题
背包算法是一种经典的动态规划算法,用于解决背包问题。背包问题是指有一个背包,容量为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]。
原文地址: https://www.cveoy.top/t/topic/oiAu 著作权归作者所有。请勿转载和采集!