• 01背包(打印路径) 之 uva 624


    //  [7/21/2014 Sjm]
    /*
    此题直接根据01背包的求解思路,记录路径,再递归输出。。1A。。
    注:
    对于最后一个测试用例 43 2 也是满足题目要求的,输出它也是对的。
    */
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <cstring>
     6 using namespace std;
     7 const int MAX_NUM = 25;
     8 const int MAX_N = 100005;
     9 struct node {
    10     int t_n; // 得到它前面那个所取节点的位置
    11     bool Judge;  // 判断当前节点是否被选择
    12 };
    13 int N, num;
    14 int dp[MAX_NUM][MAX_N], arr[MAX_NUM];
    15 node vis[MAX_NUM][MAX_N];
    16 
    17 void output(int mynum, int myN, int sum) {
    18     if (sum == 0) {
    19         return;
    20     }
    21     if (vis[mynum][myN].Judge) {
    22         output(mynum - 1, vis[mynum][myN].t_n, sum - arr[mynum]);
    23         printf("%d ", arr[mynum]);
    24     }
    25     else {
    26         output(mynum - 1, myN, sum);
    27     }
    28 }
    29 
    30 void Solve() {
    31     for (int i = 1; i <= num; ++i) {
    32         for (int k = 0; k < arr[i]; ++k) {
    33             dp[i][k] = dp[i - 1][k];
    34         }
    35         for (int j = arr[i]; j <= N; ++j) {
    36             if (dp[i - 1][j - arr[i]] + arr[i] > dp[i - 1][j]) {
    37                 dp[i][j] = dp[i - 1][j - arr[i]] + arr[i];
    38                 vis[i][j].Judge = true;
    39                 vis[i][j].t_n = j - arr[i];
    40             }
    41             else { dp[i][j] = dp[i - 1][j]; }
    42         }
    43     }
    44 
    45     int start;
    46     for (start = num; start >= 0; --start) {
    47         if (vis[start][N].Judge) {
    48             break;
    49         }
    50     }
    51     output(start, N, dp[start][N]);
    52 
    53     printf("sum:%d
    ", dp[num][N]);
    54 }
    55 
    56 int main()
    57 {
    58     //freopen("input.txt", "r", stdin);
    59     while (~scanf("%d %d", &N, &num)) {
    60         for (int i = 0; i <= num; ++i) {
    61             for (int j = 0; j <= N; ++j) {
    62                 dp[i][j] = 0;
    63                 vis[i][j].Judge = false;
    64                 vis[i][j].t_n = -1;
    65             }
    66         }
    67         for (int i = 1; i <= num; ++i) {
    68             scanf("%d", &arr[i]);
    69         }
    70         Solve();
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    8月18号心得
    题解
    考试题
    1055心得
    1055解
    1055题
    心得
    考试三道题
    2017.8.1 居然是倒数第二天了……
    1055
  • 原文地址:https://www.cnblogs.com/shijianming/p/4140827.html
Copyright © 2020-2023  润新知