poj 2392 Space Elevator

题意 :给定n种积木,每种积木都有一个高度hi,一个数量ci,还有一个限制条件,这个积木所在的位置不能高于ai,问能叠起的最大高度
// 这里有个问题需要注意 就是ai小的要先进行背包 不然 在 ai高度下 L1L2 和 L2L1是不一样的
// 然后就是简单的0-1背包了

#include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 40010 int dp[maxn]; struct node{ int h; int a; int c; bool operator <(const node &t) const{ return a<t.a; } }ar[410]; int main() { int K; while(scanf("%d",&K)!=EOF){ int i,j,k; for(i=0;i<K;i++) scanf("%d %d %d",&ar[i].h,&ar[i].a,&ar[i].c); sort(ar,ar+K); memset(dp,0,sizeof(dp)); for(i=0;i<K;i++){ for(k=1;k<=ar[i].c;k++) for(j=ar[i].a;j>=ar[i].h;j--) dp[j]=max(dp[j],dp[j-ar[i].h]+ar[i].h); } int ans=0; for(i=0;i<=ar[K-1].a;i++) ans=max(ans,dp[i]); // 开始直接输出了dp[ar[K-1].a] ,WA 下面数据就说明了问题 // 2
// 5 11 3
// 8 12 2
printf(
"%d ",ans); } return 0; }
原文地址:https://www.cnblogs.com/372465774y/p/3190748.html