题意
给出n个箱子的重量与负载量,在满足条件的情况下将这些箱子叠起来,求最多能叠多少个。
条件1:直接放置在一个箱子上的箱子数量不能超过一个
条件2:按输入顺序给箱子编号,编号小的不能叠在编号大的上面;
条件3:每个箱子上方所有箱子的重量和不能超过其负载量
约束:最多1000个箱子,重量和负载量均小于3000
解题
典型的01背包问题,注意一个箱子的负载量实际是本身负载量与其下最底部箱子的剩余负载量的最小值即可。因为处于上方箱子重量总和不能超过下方任意一个箱子的负载量。
箱子本身重量最大3000,其上负载量最大3000,那么初始背包(一个箱子都没有)的最大容量应该为3000 + 3000
AC-Code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[6005];
int n, w[1005], c[1005];
int main(){
while(scanf("%d", &n), n){
for(int i = 1; i <= n; i++)scanf("%d%d", &w[i], &c[i]);memset(dp, 0, sizeof(dp));for(int i = n; i >= 1; i--)for(int j = 6000; j >= w[i]; j--)if(dp[j] < dp[min(j - w[i], c[i])] + 1)dp[j] = dp[min(j - w[i], c[i])] + 1;printf("%d\n", dp[6000]);}
}