习题:太空梯(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;
}

浙公网安备 33010602011771号