From e5fe059422182d36905fba3bd691b7fe42fb8653 Mon Sep 17 00:00:00 2001 From: Konstantin Saveljev Date: Fri, 1 Jul 2011 15:08:08 +0300 Subject: [PATCH] 624 solved --- 624.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 624.cpp diff --git a/624.cpp b/624.cpp new file mode 100644 index 0000000..5dda3f2 --- /dev/null +++ b/624.cpp @@ -0,0 +1,70 @@ +#include +#include +using namespace std; + +int main(void) +{ + int n, sz, len[20]; + stack result; + + while (cin >> n) { + cin >> sz; + + for (int i = 0; i < sz; i++) { + cin >> len[i]; + } + + int **dp; + dp = new int*[sz+1]; + for (int i = 0; i < sz+1; i++) { + dp[i] = new int[n+1]; + } + + for (int i = 0; i < sz+1; i++) { + dp[i][0] = 0; + } + + for (int i = 0; i < n+1; i++) { + dp[0][i] = 0; + } + + for (int i = 1; i < sz+1; i++) { + for (int j = 1; j < n+1; j++) { + if (j - len[i-1] < 0) { + dp[i][j] = dp[i-1][j]; + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-len[i-1]] + len[i-1]); + } + } + } + + int sum = dp[sz][n]; + + int cur = sz; + while (cur > 0) { + if (dp[cur][n] == dp[cur-1][n]) { + cur--; + continue; + } + + result.push(len[cur-1]); + n -= len[cur-1]; + cur--; + } + + while (!result.empty()) { + cout << result.top() << " "; + result.pop(); + } + + cout << "sum:" << sum << endl; + + for (int i = 0; i < sz+1; i++) { + delete [] dp[i]; + } + + delete [] dp; + } + + return 0; +}