Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7150 | Accepted: 3352 |
Description
Input
Output
Sample Input
3 7 40 3 5 23 8 2 52 6
Sample Output
48
题目大意:有一群牛要上太空,他们计划建一个太空梯(用一些石头垒),他们有k种不同类型的石头,每一种石头的高度为h,数量为c,由于会受到太空辐射,每一种石头不能超过这种石头能够达到的最大高度a,求解利用这些石头所能修建的太空梯的最高的高度。
解题方法:多重背包,按照a从小到大对数据排序,然后用多重背包。
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; typedef struct { int h; int a; int c; }Stone; int dp[40010]; bool cmp(const Stone &s1, const Stone &s2) { return s1.a < s2.a; } int main() { int K; Stone s[405]; scanf("%d", &K); for (int i = 0; i < K; i++) { scanf("%d%d%d", &s[i].h, &s[i].a, &s[i].c); } sort(s, s + K, cmp); dp[0] = 1; for (int i = 0; i < K; i++) { for (int j = s[i].a; j >= 0; j--) { for (int k = 1; k <= s[i].c; k++) { if (j - s[i].h * k >= 0 && dp[j - s[i].h * k] != 0) { dp[j] = 1; } } } } for (int i = 40010; i >=0; i--) { if (dp[i]) { printf("%d\n", i); break; } } return 0; }