题目链接: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\n",i);
break;
}
}
return 0;
}
原文:https://www.cnblogs.com/jaszzz/p/12686141.html