POJ3629 Card Stacking C语言代码
时间: 2024-10-18 13:18:57 浏览: 46
C语言Poj答案全完整打包
3星 · 编辑精心推荐
POJ 3629 "Card Stacking"是一个经典的动态规划问题,它通常涉及到塔的构建和卡片排列。题目描述了一个有限高度的塔,每张牌都有一个重量和值。目标是找到一种堆叠顺序,使得塔的总价值最大,同时不超过塔的最大承受能力。
以下是使用C语言的一个简单思路的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1005
int dp[MAXN][MAXN]; // 动态规划数组,dp[i][j]表示前i张牌中选择j个可以达到的最大价值
int main() {
int n, maxWeight;
scanf("%d %d", &n, &maxWeight);
// 初始化动态规划数组
for (int i = 0; i <= n; i++) {
dp[i][0] = 0; // 当选0张牌时,价值为0
}
for (int j = 1; j <= n; j++) { // 遍历所有牌
int cardValue, cardWeight;
scanf("%d %d", &cardValue, &cardWeight);
// 从第j张牌开始计算,更新所有可能选的卡组合
for (int k = 1; k <= min(j, maxWeight); k++) {
dp[j][k] = max(dp[j - 1][k], dp[j - 1][k - 1] + cardValue); // 保留旧方案或加入当前牌
}
}
// 找到最大的价值
int maxValue = 0;
for (int i = 0; i <= n && i <= maxWeight; i++) {
maxValue = max(maxValue, dp[n][i]);
}
printf("Max value: %d\n", maxValue);
return 0;
}
```
阅读全文