题目大意:一只奶牛(这不知道是多么牛的牛还是在讽刺谁),她想翱翔太空,于是就找来些石头,石头呢有不同的种类,每种石头呢有自己的高度以及能搭在一起所达的最大高度,还有每种石头的数量.问这些石头能答的最大高度;
典型的多重背包问题。
注意:由于是最大高度,所以应该能搭的矮的石头来搭下面,然后能搭高的搭在上面,故此,要对其按照所能达到的高度对每种石头进行排序!
必须:结构体数组,每个结构内有三个整数,第一个表示这种石头的高度,第二个整数表示本种石头所能达的最大高度,第三个整数表示这种石头的数量;一个动态数组;一个记录石头个数的数组;
详细代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXV 410
#define MAXM 40010
typedef struct {
int h,a,c;
}Blocks;
Blocks v[MAXV];
int cmp(Blocks x,Blocks y){
return x.a<y.a;
}
int dp[MAXM],user[MAXM];
int main(){
int i,t,j,M;
while(~scanf("%d",&t)){
for(i=1;i<=t;i++){
scanf("%d%d%d",&v[i].h,&v[i].a,&v[i].c);
}
sort(v+1,v+t+1,cmp);
memset(dp,0,sizeof(dp));
dp[0]=1;
M=0; //赋值为0,高度可能为零
for(i=1;i<=t;i++){
memset(user,0,sizeof(user));
for (j=v[i].h;j<=v[i].a;j++){
if(!dp[j] && dp[j-v[i].h] && user[j-v[i].h]+1<=v[i].c){
dp[j]=1;
user[j]=user[j-v[i].h]+1;
if(j>M) M=j;
}
}
}
printf("%d\n",M);
}
return 0;
}