[Jzoj] 1286. 太空电梯

博客围绕奶牛用K种石块造太空电梯的问题展开。每种石块有高度、数量及最高可达高度限制,目标是堆出最高电梯。采用DP方法求解,设f[j]表示是否有高度为j的情况,对石块按最高可达高度排序,通过三重循环枚举,给出状态转移方程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

奶牛们想用K(1&lt;=K&lt;=400)K(1&lt;=K&lt;=400)K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度hi(1&lt;=hi&lt;=100)h_i(1&lt;=h_i&lt;=100)hi(1<=hi<=100)和数量ci(1&lt;=ci&lt;=10),c_i(1&lt;=c_i&lt;=10),ci(1<=ci<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度ai(1&lt;=ai&lt;=40000)a_i(1&lt;=a_i&lt;=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]&gt;0∣∣f[k−a[i].h):f[k]=1(f[k]&gt;0 || f[k-a[i].h)f[k]=1(f[k]>0f[ka[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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值