使用C语言用动态规划实现:暗黑游戏中,装备直接决定玩家人物的能力。可以使用 Pg 和 Rune 购买需要的物品。暗 黑市场中的装备,每件有不同的价格(Pg 和 Rune)、能力值、最大可购买件数。Kid 作为暗 黑战网的一个玩家,当然希望使用尽可能少的 Pg 和 Rune 购买更优的装备,以获得最高的能 力值。请你帮Kid计算出现有支付能力下的最大可以获得的能力值。 输入格式: 第一行,三个整数 N,P,R,分别代表市场中物品种类,Pg 的支付能力和 Rune 的支付能力。 第 2..N+1 行,每行四个整数,前两个整数分别为购买此物品需要花费的 Pg,Rune,第 三个整数若为 0,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多 件数(S),第四个整数为该装备的能力值。 输出格式: 仅一行,一个整数,最大可获得的能力值。 输入样例: 3 10 10 5 3 0 110 4 3 4 120 2 3 1 130 输出样例: 370
时间: 2024-02-23 22:00:39 浏览: 162
```c
#include <stdio.h>
#include <stdlib.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
typedef struct equip {
int pg; // 花费的 Pg
int rune; // 花费的 Rune
int num; // 最大可购买件数
int val; // 装备的能力值
} Equip;
int main() {
int n, p, r;
scanf("%d %d %d", &n, &p, &r);
Equip *equip = (Equip *)malloc(n * sizeof(Equip));
for (int i = 0; i < n; i++) {
scanf("%d %d %d %d", &equip[i].pg, &equip[i].rune, &equip[i].num, &equip[i].val);
}
int ***dp = (int ***)malloc((n + 1) * sizeof(int **));
for (int i = 0; i <= n; i++) {
dp[i] = (int **)malloc((p + 1) * sizeof(int *));
for (int j = 0; j <= p; j++) {
dp[i][j] = (int *)calloc(r + 1, sizeof(int));
}
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= p; j++) {
for (int k = 0; k <= r; k++) {
dp[i][j][k] = dp[i - 1][j][k]; // 不买第 i 件物品
for (int p = 1; p <= equip[i - 1].num; p++) {
if (j >= p * equip[i - 1].pg && k >= p * equip[i - 1].rune) {
dp[i][j][k] = max(dp[i][j][k], dp[i][j - p * equip[i - 1].pg][k - p * equip[i - 1].rune] + p * equip[i - 1].val); // 买第 i 件物品
}
}
}
}
}
printf("%d\n", dp[n][p][r]); // 最大能力值为 dp[n][p][r]
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= p; j++) {
free(dp[i][j]);
}
free(dp[i]);
}
free(dp);
free(equip);
return 0;
}
```
阅读全文