UVA 624 (0 1背包 + 打印路径)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#define N 1010

using namespace std;

int dp[N], path[N][N], w[N];

int main()
{
    int v, n;
    while(~scanf("%d", &v))
    {
        scanf("%d", &n);
        memset(dp, 0, sizeof(dp));
        memset(path, 0, sizeof(path));
        for(int i = 1 ; i <= n ;i++)
            scanf("%d", &w[i]);
        for(int i = n ; i >= 0 ; i--)
        {
            for(int j = v ; j >= w[i] ; j--)
            {
                if(dp[j] <= dp[j - w[i]] + w[i])
                {
                    dp[j] = dp[j - w[i]] + w[i];
                    path[i][j] = 1;
                }//path记录
            }
        }
        int j = v;
        for(int i = 1 ; i <= n ; i++)
        {
            if(path[i][j])
            {
                printf("%d ", w[i]);
                j -= w[i];
            }
        }//打印路径
        printf("sum:%d\n", dp[v]);
    }
    return 0;
}
时间: 2024-11-05 20:25:42

UVA 624 (0 1背包 + 打印路径)的相关文章

UVA 624 CD (01背包+打印路径 或 dfs+记录路径)

Description You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is on CDs. You need to have it on tapes so the problem to solve is: you have a tape N minutes long. How to choose tracks from CD to get most o

uva 624 CD 01背包打印路径

// 集训最终開始了.来到水题先 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int a[23]; int d[23][100000]; int flag[23]; int W,n; void init(){ cin >> n; for (int i=1;i<=n;i++) cin >

Uva 642-CD(0-1背包+打印路径)

题目链接:点击打开链接 裸01背包 ,此题中 价值即体积... 打印路径..不多说了 一维的没看懂..上个二维的 #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <vector> #include <cstdio>

0-1背包打印路径(递归和非递归版本)

简单的0-1背包打印路径问题,我们可以记录一个p[][]数组来判断,当前物品是否被选中,最后按照记录输出,注意是逆序. #include<stdio.h> #include<string.h> int main() { int a[25],p[25][10005],i,j,n,m,s[10005]; while(scanf("%d%d",&m,&n)!=EOF){ for(i=1;i<=n;i++) scanf("%d"

uva 116 Unidirectional TSP dp + 打印路径

// uva116 Unidirectional TSP // 这题是在紫书(page 270)上看到的,个人理解就是数塔的升级版 // dp[i][j]表示从(i,j)出发到终点所达到的最大价值 // 所以很明显j是逆序的 // 状态转移方程为 // dp[i][j] = min(dp[i][j],dp[row[k]][j+1]+mp[i][j]) // rows[k]表示三行中的一行i,i-1,i+1,特判一下,排个序 // (因为多解时输出字典序最小的值) // 这题唯一比较难的地方就是打

UVA 624 CD (01背包)

//路径记录方法:若是dp[j-value[i]]+value[i]>dp[j]说明拿了这个东西,标志为1, //for循环标志,发现是1,就打印出来,并把背包的容量减少,再在次容量中寻找标志: #include <iostream> #include <cstring> #include <algorithm> using namespace std; int value[30],dp[10001],s[30][10001]; int main() { int

UVA 624 CD

CD Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 62464-bit integer IO format: %lld      Java class name: Main You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music

UVA624(01背包记录路径)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=565 01背包打印路径. #include <cstdio> #include <cstring> using namespace std; const int MAXN=10005; int n,W; int w[30]; int dp[MAXN]; in

hdu--1160--LIS+打印路径

这题做完  就去吃饭了... 快1年了 没有正常的饮食.... 这题 数据蛮小的 1000可以用O(n^2)水过 而且只花了0ms 一般来说 打印路径是正序输出 而我们记录的时候都是 逆序记录的  所以 借用下stack特别好用 touch    me 1 #include <iostream> 2 #include <algorithm> 3 #include <stack> 4 using namespace std; 5 6 const int size = 10