#include <stdio.h>
#include <stdlib.h>
//0-1背包问题是一种经典的组合优化问题,
//问题描述为:有一个给定容量的背包和一组具有不同价值和重量的物品,如何选择物品放入背包中,以使得背包中物品的总价值最大化,同时不超过背包的容量限制。
#define max(a, b) ((a) > (b) ? (a) : (b))
int knapsack(int W, int wt\[\], int val\[\], int n) {//背包函数这是一个名为knapsack的函数,它接受四个参数:
//W:表示背包的总容量。
//wt\[\]:一个整数数组,表示每个物品的重量。
//val\[\]:一个整数数组,表示每个物品的价值。
//n:表示物品的数量。
int i, w;
int Kn+1W+1; // 填充 K()() 数组
for (i = 0; i <= n; i++) {//遍历每个物品
for (w = 0; w <= W; w++) {//遍历背包容量
if (i == 0 || w == 0) {
Kiw = 0;
} else if (wti-1 <= w) {// 如果物品i的重量wti-1小于等于背包容量w,
Kiw = max(vali-1 + Ki-1w-wt\[i-1], Ki-1w);
//可以将物品i放入背包,或者不放入背包。在这两种情况下,选择能够获得更大总价值的方案,并将对应的价值存储在Kiw中。
} else {//如果物品i的重量wti-1大于背包容量w,那么物品i无法放入背包,因此Kiw的值保持不变,即等于Ki-1w。
Kiw = Ki-1w;
}
}
}
return KnW;//即表示在给定背包容量和物品重量、价值的情况下,能够装入背包的物品的最大总价值。
}
int main() {
int val\[\] = {60, 100, 120};
int wt\[\] = {10, 20, 30};
int W = 50;
int n = sizeof(val) / sizeof(val0);//物品的数量
printf("背包中能装的最大价值为:%d\n", knapsack(W, wt, val, n));
return 0;
}