习题:太空梯(DP)

 

题目

有一群牛要上太空。他们计划建一个太空梯-----用一些石头垒。他们有k(1<=k<=400)种不同类型的石头,每一种石头的高度为hi(1<=hi<=100),数量为ci(1<=ci<=10),并且由于会受到太空辐射,每一种石头不能超过这种石头的最大建造高度ai(1<=ai<=40000)。帮助这群牛建造一个最高的太空梯。

输入格式

第一行为一个整数即k。第2行到第k+1行每一行有3个数,代表每种类型石头的特征,即高度h,限制高度a和数量c。

输出格式

一个整数,即修建太空梯的最大高度。

思路

很明显,必须先将所有的石头按照限制的高度排序
之后定义dp[i]表示能否到达i的高度
其实本质上就是一个背包问题
某位机房大犇选择二进制优化
之后,暴力转移即可

代码

#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct node
{
	int h;
	int c;
	int a;
	friend bool operator < (const node &a,const node &b)
	{
		return a.a<b.a;
	}
}a[405];
int maxx=-1;
bool dp[40005];
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+n+1);
	dp[0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=a[i].a;j>=0;j--)
		{
			for(int k=0;k<=a[i].c&&k*a[i].h<=j;k++)
			{
				if(dp[j-k*a[i].h]==1)
				{
					maxx=max(j,maxx);
					dp[j]=1;
					break;
				}
			}
		}
	}
	cout<<maxx;
	return 0;
}
posted @ 2019-10-05 16:51  loney_s  阅读(194)  评论(0)    收藏  举报