送牛上太空的一道题:有K种类型的方块,每行表示方块高度,能坚持的极限高度,方块个数
一维dp[i]数组表示高度i是否可行,初始为0
关键代码为三层for循环,外层i看不同的方块(方块已经排过序),第二层j遍历同一种方块的个数,第三层k遍历高度
从低高度到高高度正向做应该也行,但是写起来比较复杂,反向去做代码比较简洁
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
int h,a,c;
}block[410];//tower blocks
int dp[40010];//高度为i可行吗
bool cmp(node a,node b){
return a.a<b.a;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(cin>>n){
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
cin>>block[i].h>>block[i].a>>block[i].c;
}
sort(block,block+n,cmp);
dp[0] = 1;
for(int i=0;i<n;i++){
for(int j=0;j<block[i].c;j++){
for(int k=block[i].a;k>=block[i].h;k--){
dp[k] |= dp[k-block[i].h];
}
}
}
for(int i=block[n-1].a;i>=0;i--){
if(dp[i]){
cout<<i<<endl;
break;
}
}
}
return 0;
}