zoukankan      html  css  js  c++  java
  • PAT 1068. Find More Coins

    标准10背包

    #include <cstdio>
    #include <cstdlib>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    const int ROWS = 10002;
    const int COLS = 102;
    
    char dp[ROWS][COLS];
    
    bool dfs(vector<int> &coins, vector<int> &path, int idx, int target) {
        if (dp[idx][target] != -1) {
            return dp[idx][target];
        }
        if (idx >= coins.size()) return false;// should not happen
        if (coins[idx] == target) {
            // we found one
            path.push_back(idx);
            return true;
        }
        if (idx == coins.size() - 1) {
            // no more coins to try
            return false;
        }
        path.push_back(idx);
        // try use current idx coin
        if (coins[idx] < target) {
            if (dfs(coins, path, idx + 1, target - coins[idx])) {
                return true;
            }
        }
        path.pop_back();
        // try not use current idx coin
        if (dfs(coins, path, idx + 1, target)) {
            return true;
        }
        dp[idx][target] = false;
        return dp[idx][target];
    }
    
    int main() {
        int N, M;
        scanf("%d%d", &N, &M);
        
        vector<int> coins(N);
        
        for (int i=0; i<N; i++) {
            scanf("%d", &coins[i]);
        }
        sort(coins.begin(), coins.end());
        
        for (int i=0; i<ROWS; i++) {
            for (int j=0; j<COLS; j++) {
                dp[i][j] = -1;
            }
        }
        
        // use current st. j-coins>=0
        //dp[i][j] = dp[i-1][j-coins[i]]
        // not use current
        //dp[i][j] = dp[i-1][j];
        vector<int> path;
        bool res = dfs(coins, path, 0, M);
        int len = path.size();
        if (res) {
            if (len > 0) {
                printf("%d", coins[path[0]]);
            }
            for (int i=1; i<len; i++) {
                printf(" %d", coins[path[i]]);
            }
        } else {
            printf("No Solution");
        }
        return 0;
    }
  • 相关阅读:
    155. 最小栈
    160. 相交链表
    PAT 1057 Stack
    PAT 1026 Table Tennis
    PAT 1017 Queueing at Bank
    PAT 1014 Waiting in Line
    PAT 1029 Median
    PAT 1016 Phone Bills
    PAT 1010 Radix
    PAT 1122 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/lailailai/p/4093889.html
Copyright © 2011-2022 走看看