链接:
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/G
每个CD的时间不超过 20
没有哪个CD的时间是超过N的
CD不能重复
每个长度和N都是一个整数
代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<algorithm> using namespace std; #define N 2000 #define INF 0xfffffff int v[N], dp[N][N]; void Path(int n, int W) { if(n==0) return ; if(dp[n][W]==dp[n-1][W]) Path(n-1, W); else { Path(n-1, W-v[n]); printf("%d ", v[n]); } } int main() { int W, n, i, j; while(scanf("%d%d", &W, &n)!=EOF) { memset(v, 0, sizeof(v)); memset(dp, 0, sizeof(dp)); for(i=1; i<=n; i++) scanf("%d", &v[i]); for(i=1; i<=n; i++) for(j=0; j<=W; j++) { if(j<v[i]) dp[i][j] = dp[i-1][j]; else { dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]]+v[i]); } } Path(n, W); printf("sum:%d\n", dp[n][W]); } return 0; }
DP思路:dp[i] 代表第 i 个箱子在最上方的时候所摞起来的最大高度。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<queue> #include<cmath> using namespace std; #define INF 0x3fffffff #define maxn 100200 typedef long long LL; struct Box { int L, W, H;///箱子的长宽高 Box(int LL=0,int WW=0,int HH=0):L(LL), W(WW), H(HH) { if(L<W)swap(L,W); } bool friend operator < (Box A, Box B) { if(A.L != B.L) return A.L > B.L; if(A.W != B.W) return A.W > B.W; return A.H > B.H; } }P[maxn]; int dp[maxn]; int main() { int i, j, cas = 1, n; while(scanf("%d",&n), n) { int k = 0, ans = 0; for(i=0; i<n; i++) { int L, W, H; scanf("%d %d %d",&L, &W, &H); P[k ++] = Box(L, W, H); P[k ++] = Box(L, H, W); P[k ++] = Box(W, H, L); } sort(P, P+k); for(i=0; i<k; i++) { dp[i] = P[i].H; for(j=0; j<i; j++) { if(P[i].L < P[j].L && P[i].W < P[j].W) dp[i] = max(dp[i], dp[j] + P[i].H); } ans = max(ans, dp[i]); } printf("Case %d: maximum height = %d\n", cas ++, ans); } return 0; }