题目链接:http://poj.org/problem?id=2392
题意:有n种石头,每个石头的高度hi,允许用的最高高度为ai,数量为ci,求能组合的最高高度。
思路:一道典型的完全背包问题,还是套路
ac 代码:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define MAX_N 40005 using namespace std; typedef long long ll; int k; bool dp[MAX_N]; struct Block { int h; int a; int c; }block[405]; bool cmp(Block m,Block n){ return m.a<n.a; } int main(void){ while(~scanf("%d",&k)){ for(int i=0;i<k;i++) scanf("%d%d%d",&block[i].h,&block[i].a,&block[i].c); sort(block,block+k,cmp); memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<k;i++) for(int j=0;j<block[i].c;j++) for(int s=block[i].a;s>=block[i].h;s--) dp[s]|=dp[s-block[i].h]; for(int i=block[k-1].a;i>=0;i--) if(dp[i]){ printf("%d ",i); break; } } return 0; }