AT_dp_x Tower题解

题目描述

你有 n 个箱子,编号从 1 到 n,每个箱子有三个属性,以第 i 个箱子为例,分别是重量 wi​,承重能力 si​,价值 vi​。

你想建一座塔,因此需要将一些箱子堆叠起来,但是每个箱子必须满足下面的条件:

  • 这个箱子上面的所有箱子重量和要小于等于这个箱子的承重能力。

定义一个塔的价值为它所用的所有箱子的价值和。

最大化这个塔的价值并输出它。

输入格式

第一行一个整数 n,表示箱子数量。

接下来 n 行,一行三个整数,用来描述这个箱子的三个属性 wi​,si​,vi​。

输出格式

一行一个整数,表示塔的最大价值。

显示翻译

题意翻译

输入输出样例

输入 #1复制

3
2 2 20
2 1 30
3 1 40

输出 #1复制

50

输入 #2复制

4
1 2 10
3 1 10
2 4 10
1 6 10

输出 #2复制

40

输入 #3复制

5
1 10000 1000000000
1 10000 1000000000
1 10000 1000000000
1 10000 1000000000
1 10000 1000000000

输出 #3复制

5000000000

输入 #4复制

8
9 5 7
6 2 7
5 7 3
7 8 8
1 9 6
3 3 3
4 1 7
4 5 5

输出 #4复制

22

说明/提示

n≤103,1≤wi​,si​≤104,1≤vi​≤109。

思路

背包DP。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,f[1003][20004],lk=0;
struct one{
    long long w,s,v;
}a[1005];
bool cmp(one a1,one b1){
    return a1.w+a1.s<b1.w+b1.s;
}
int main(){
	cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].w>>a[i].s>>a[i].v;
    }
    sort(a+1,a+n+1,cmp);
    memset(f,-0x3f3f3f3f,sizeof(f));
    f[0][0]=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=20000;j++){
            f[i][j]=f[i-1][j];
            if(j>=a[i].w&&j-a[i].w<=a[i].s){
                f[i][j]=max(f[i][j],f[i-1][j-a[i].w]+a[i].v);
            }
        }
    }
    for(int i=0;i<=20000;i++){
        lk=max(lk,f[n][i]);
    }
    cout<<lk<<endl;
	return 0;
}

posted @ 2025-10-23 10:40  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源