[Jzoj] 1286. 太空电梯

题目描述

奶牛们想用 K ( 1 &lt; = K &lt; = 400 ) K(1&lt;=K&lt;=400) K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度 h i ( 1 &lt; = h i &lt; = 100 ) h_i(1&lt;=h_i&lt;=100) hi(1<=hi<=100)和数量 c i ( 1 &lt; = c i &lt; = 10 ) , c_i(1&lt;=c_i&lt;=10), ci(1<=ci<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度 a i ( 1 &lt; = a i &lt; = 40000 ) a_i(1&lt;=a_i&lt;=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 ] &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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值