标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9970 | Accepted: 4738 |
Description
Input
Output
Sample Input
3 7 40 3 5 23 8 2 52 6
Sample Output
48
Hint
题意:奶牛想上太空给顶n种梯子,每种梯子对应三个值,a,h,c,a表示这种梯子必须在小于等于a的高度内使用,h表示它的高度,c表示这种梯子的个数。问内牛能够累出的最大高度。
分析:根据a从小到大排序,然后对于每一个找到背包容量为a的最大高度,可以用01背包处理,对每一个奶牛的梯子作为一个物品,物品的种数就是c;当然也可以用多重背包解
思路就是辣么简单就是没想出来,弱渣
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 const int MAX = 50000; 7 int dp[MAX]; 8 struct node 9 { 10 int h,a,c; 11 }; 12 node cow[500]; 13 int cmp(node x, node y) 14 { 15 return x.a < y.a; 16 } 17 18 int main() 19 { 20 int k; 21 while(scanf("%d", &k) != EOF) 22 { 23 for(int i = 0; i < k; i++) 24 { 25 scanf("%d%d%d",&cow[i].h,&cow[i].a,&cow[i].c); 26 } 27 memset(dp,0,sizeof(dp)); 28 sort(cow, cow + k, cmp); 29 for(int i = 0; i < k; i++) 30 { 31 for(int t = 1; t <= cow[i].c; t++) 32 { 33 for(int j = cow[i].a; j >= cow[i].h; j--) 34 { 35 if(dp[j] <= cow[i].a && dp[j - cow[i].h] + cow[i].h <= cow[i].a) 36 dp[j] = max(dp[j], dp[j - cow[i].h] + cow[i].h); 37 } 38 } 39 } 40 int ans = 0; 41 for(int i = 1; i <= cow[k - 1].a; i++) //这一步还是在斌神那里得到的提示,太弱了 42 ans = max(ans, dp[i]); 43 printf("%d\n", ans); 44 } 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/zhaopAC/p/5049430.html