题目描述
奶牛们想用 K ( 1 < = K < = 400 ) K(1<=K<=400) K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度 h i ( 1 < = h i < = 100 ) h_i(1<=h_i<=100) hi(1<=hi<=100)和数量 c i ( 1 < = c i < = 10 ) , c_i(1<=c_i<=10), ci(1<=ci<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度 a i ( 1 < = a i < = 40000 ) a_i(1<=a_i<=40000) ai(1<=ai<=40000)
帮助奶牛用石块堆积一个最高的太空电梯
题目解析
D P DP DP
设 f [ j ] f[j] f[j]为是否有高度为 j j j这种情况,有则为 1 1 1,没有则为 0 0 0
开始将每种石块不能超过最高可以达到的高度,从小到大排序
然后三重循环枚举 i , j , k ; i i,j,k;i i,j,k;i枚举第 i i i种石头 ; j ;j ;j枚举放 i i i种石头的个数 ; k ;k ;k枚举可能到达的高度
状态转移方程 : f [ k ] = 1 ( f [ k ] > 0 ∣ ∣ f [ k − a [ i ] . h ) :f[k]=1(f[k]>0 || f[k-a[i].h) :f[k]=1(f[k]>0∣∣f[k−a[i].h)
代码
#include<bits/stdc++.h>
#define L long long
using namespace std;
L n;
int f[40005];
struct A
{
L h,a,c;
}a[405];
bool cmp(A x,A y)
{
return x.a<y.a;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].h>>a[i].a>>a[i].c;
sort(a+1,a+1+n,cmp);
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=a[i].c;j++)
for(int k=a[i].a;k>=a[i].h;k--)
if(f[k]||f[k-a[i].h])
f[k]=1;
for(int i=40000;i>=0;i--)
if(f[i])
{
cout<<i;
break;
}
return 0;
}