zoukankan      html  css  js  c++  java
  • (动态规划 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;
    }
    勿忘初心
  • 相关阅读:
    [codevs]失恋28天题目系列
    [NOIP1998]最大数
    [codevs4247]奇特的生物
    [codevs1380]没有上司的舞会
    [codevs2152]滑雪
    [codevs2171]棋盘覆盖
    [codevs2170]悠闲的漫步
    [codevs1557]热浪
    [codevs1554]最佳课题选择
    nodejs建站+github page 建站问题总结
  • 原文地址:https://www.cnblogs.com/YY56/p/4731244.html
Copyright © 2011-2022 走看看