本文共 1900 字,大约阅读时间需要 6 分钟。
背包容量为v的背包问题需要找到一种物品选择方式,使得背包的总价值最大化。物品被分成t组,每组最多选一个物品。这意味着在选择物品时,需要考虑每组的限制条件。
动态规划(DP)是一种有效的方法来解决这类背包问题。我们可以使用一个数组dp[j],其中dp[j]表示背包容量为j时的最大价值。初始化时,dp数组的所有元素都设为0,表示没有物品被选取时的价值。
这种方法确保每个组别最多选择一个物品,从而满足题目要求。
题目大意
背包容量为v。现有n个物品,每个物品有重量、价值和所属组号。物品分成t组,每组最多选一个物品。求背包能装下的最大价值。
输入
第一行:三个整数v、n、t;
接下来的n行:每行三个整数wi、ci、pj,分别表示每个物品的重量、组号和价值。
输出
仅一行,表示最大总价值。
思路
使用动态规划解决方案。初始化一个dp数组,dp[j]表示重量为j时的最大价值。遍历每个组别,逐个处理每个物品,更新dp数组以考虑是否选择该物品。确保每个组别最多选一个物品,从而得到最大价值。
代码
#include#include using namespace std; int v, n, t; int a[11][11] = {0}; int b[11][11] = {0}; int c[11] = {0}; void init() { int zl, jz, zb; scanf("%d %d %d", &v, &n, &t); for (int i = 1; i <= n; ++i) { scanf("%d %d %d", &zl, &jz, &zb); a[zb][c[zb]] = zl; b[zb][c[zb]] = jz; c[zb]++; } } void work() { int dp[v+1] = {0}; for (int i = 1; i <= t; ++i) { for (int j = v; j > 0; --j) { for (int k = 1; k <= c[i]; ++k) { if (j >= a[i][k]) { if (dp[j] < dp[j - a[i][k]] + b[i][k]) { dp[j] = dp[j - a[i][k]] + b[i][k]; } } } } } printf("%d", dp[v]); } int main() { init(); work(); return 0; }
这种方法确保每个组别最多选择一个物品,从而满足题目要求,并通过动态规划高效地解决了问题。
转载地址:http://cuug.baihongyu.com/