Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 9992 |
|
Accepted: 4752 |
Description
Input
Output
Sample Input
3
7 40 3
5 23 8
2 52 6
Sample Output
48
Hint
题意:一群牛想搭一条天梯,有k种木板,每种木板的长度为h_i,数量为c_i,但是由于紫外线对木板造成伤害,每种木板架在天梯上的高度不能超过a_i。求解天梯在符合规则的搭建下的最大高度。
题解:先将木板的按照受限最大高度从小到大排序,然后多重背包求解。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[40010],sum[40010]; struct node { int h,maxh,num; }a[410]; int cmp(node a,node b) { return a.maxh<b.maxh; } int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;++i) scanf("%d%d%d",&a[i].h,&a[i].maxh,&a[i].num); sort(a,a+n,cmp); memset(dp,0,sizeof(dp)); dp[0]=1; int ans=0; for(i=0;i<n;++i) { memset(sum,0,sizeof(sum)); for(j=a[i].h;j<=a[i].maxh;++j) { if(!dp[j]&&dp[j-a[i].h]&&sum[j-a[i].h]<a[i].num) { dp[j]=1; sum[j]=sum[j-a[i].h]+1; if(ans<j) ans=j; } } } printf("%d\n",ans); } return 0; }