(动态规划 01背包 打印路径) CD --UVA --624

链接:

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
", 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
", cas ++, ans);
    }
    return 0;
}
勿忘初心
原文地址:https://www.cnblogs.com/YY56/p/4731244.html