题目描述
奶牛们想用K(1<=K<=400)K(1<=K<=400)K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度hi(1<=hi<=100)h_i(1<=h_i<=100)hi(1<=hi<=100)和数量ci(1<=ci<=10),c_i(1<=c_i<=10),ci(1<=ci<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度ai(1<=ai<=40000)a_i(1<=a_i<=40000)ai(1<=ai<=40000)
帮助奶牛用石块堆积一个最高的太空电梯
题目解析
DPDPDP
设f[j]f[j]f[j]为是否有高度为jjj这种情况,有则为111,没有则为000
开始将每种石块不能超过最高可以达到的高度,从小到大排序
然后三重循环枚举i,j,k;ii,j,k;ii,j,k;i枚举第iii种石头;j;j;j枚举放iii种石头的个数;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;
}