首页 > 其他 > 详细

UVA 624 CD (01背包 带路径)

时间:2016-05-04 21:05:32      阅读:232      评论:0      收藏:0      [点我收藏+]

题意 输入两个数 len,n 表示长度和个数,接下来输入n个数, 表示每一个的长度, 求这n个数能够组成的不超过len的最大长度,并输出这些数。

分析:01背包,dp数组非0表示可以组成的数,dp数组用来记录路径

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <algorithm>

using namespace std;

const int maxn = 2005;

int a[22];
int dp[maxn];

int main()
{
    int len, n;
    while(~scanf("%d%d", &len, &n))
    {
        memset(dp, 0, sizeof(dp));
        for(int i=1; i<=n; i++)
        {
            scanf("%d", &a[i]);
        }
        dp[0] = 1;
        int Max = 0;
        for(int i=n; i>=1; i--)
        {
            for(int j=len; j>=a[i]; j--)
            {
                if(dp[j-a[i]]&&dp[j]==0)
                {
                    dp[j] = a[i];
                }
            }
        }
        while(dp[len]==0)
            len--;
        Max = len;
        while(len)
        {
            printf("%d ", dp[len]);
            len -= dp[len];
        }
        printf("sum:%d\n", Max);
    }

    return 0;
}

 

UVA 624 CD (01背包 带路径)

原文:http://www.cnblogs.com/mengzhong/p/5459687.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!