P1049 [NOIP2001 普及组] 装箱问题C语言
时间: 2025-04-30 08:50:01 浏览: 36
### NOIP2001 普及组 装箱问题 C语言 实现 解题思路
#### 一维背包问题转换
装箱问题可以视为一种特殊的动态规划问题,类似于一维背包问题。目标是在给定容量的情况下最大化装载物品的数量或价值,在此特定情况下是将一系列不同尺寸的物体放入固定大小的箱子中。
#### 数据结构设计
定义数组 `f[j]` 表示前若干件商品恰好填满体积为 j 的最小数量。对于每一个新加入的商品 i ,更新 f 数组中的值来反映新的最优解状态变化情况[^1]。
#### 动态转移方程构建
设当前处理到第i个物件,其占用空间为w[i],则有如下递推关系:
当j >= w[i]时,
\[ f[j]=min(f[j-w[i]]+1,f[j]) \]
其中 \(f[0]\) 初始化为0表示没有任何货物的状态下所需容器数目自然也为零;其他位置初始化成无穷大(INF),意味着这些状态下暂时无法达到有效配置方案.
```c
#include <stdio.h>
#define INF (int)(1e9)
const int maxv = 50 * 100 + 1;
int v, n;
int weight[30];
bool used[maxv];
void solve() {
fill(used, used + maxv, false);
for(int i = 0; i < n ; ++i){
for(int j = v - weight[i]; j >= 0; --j){
if(!used[j]){
used[j + weight[i]] = true;
}
}
}
}
int main(){
scanf("%d %d", &v, &n);
for(int i = 0; i < n; ++i){
scanf("%d", &weight[i]);
}
solve();
int cnt = 0;
for(int i = 0; i <= v; ++i){
if(used[i])
++cnt;
}
printf("%d\n", cnt);
}
```
上述代码实现了基于布尔型数组记录可行性的简化版本,实际比赛中可能更倾向于使用整数类型的dp表来进行更加精确的结果计算并返回最终所需的最少集装箱数量而非简单计数可填充的空间组合总数.
阅读全文
相关推荐















