0/1背包问题动态规划C语言
时间: 2024-12-06 12:04:55 浏览: 50
0/1背包问题是一种经典的动态规划问题,它涉及到给定一组物品,每个物品有自己的价值和重量,以及一个最大容量的背包。目标是选择一些物品放入背包,使得总价值最大化,同时保证不超过背包的容量限制,且每个物品只能取一次(即0/1约束)。
以下是使用C语言解决0/1背包问题的简单动态规划算法步骤:
1. 定义二维数组dp[i][w],其中i表示物品的数量,w表示当前背包的剩余容量。dp[i][w]表示前i个物品能填满容量为w的背包的最大价值。
2. 初始化状态:对于所有物品i和容量w,如果物品i的重量大于w,则无法放入背包,dp[i][w] = dp[i-1][w];否则,可以选择放或不放这个物品,dp[i][w] = max(dp[i-1][w], value[i] + dp[i-1][w-weight[i]])。
3. 最终的答案就是dp[n][W],n是物品总数,W是背包的容量。
```c
#include <stdio.h>
int knapsack(int W, int wt[], int val[], int n) {
int i, w;
int dp[n+1][W+1];
// 填充动态规划表
for (i = 0; i <= n; i++) {
for (w = 0; w <= W; w++) {
if (i == 0 || w == 0)
dp[i][w] = 0;
else if (wt[i-1] <= w)
dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w]);
else
dp[i][w] = dp[i-1][w];
}
}
return dp[n][W];
}
int main() {
int W = 50; // 背包容量
int wt[] = {10, 20, 30}; // 物品重量
int val[] = {60, 100, 120}; // 物品价值
int n = sizeof(wt) / sizeof(wt[0]);
printf("最大价值: %d\n", knapsack(W, wt, val, n));
return 0;
}
```
阅读全文