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;
}

浙公网安备 33010602011771号