Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #define INF 1000
- using namespace std;
- int **dp;
- vector<int> result;
- int min(int a, int b)
- {
- if (a > b)
- return a;
- else
- return b;
- }
- void Print(int n, int m)
- {
- for (int i = 0; i <= m; i++)
- {
- for (int j = 0; j <= n; j++)
- cout << dp[i][j] << " ";
- cout << endl;
- }
- }
- void FindWay(int i, int j)
- {
- if (dp[i][j] == 0 || dp[i][j] == INF)
- return;
- if (dp[i - 1][j] == dp[i][j])
- {
- FindWay(i - 1, j);
- }
- else
- {
- FindWay(i - 1, j - (int)pow(i, 3));
- result[i]++;
- }
- }
- void GetResult(int n)
- {
- int m = (int)pow((double) n, 1.0 / 3);
- dp = new int*[m + 1];
- for (int i = 0; i <= m; i++)
- dp[i] = new int[n + 1];
- dp[0][0] = 0;
- for (int i = 1; i <= n; i++)
- dp[0][i] = INF;
- for (int i = 1; i <= m; i++)
- for (int j = 0; j <= n; j++)
- {
- if (j < (int)pow(i, 3) - 1)
- dp[i][j] = dp[i - 1][j];
- else
- dp[i][j] = min(dp[i - 1][j], dp[i][j - (int)pow(i, 3)] + 1);
- }
- Print(n, m);
- cout << "result: " << dp[m][n] << endl;
- system("pause");
- result.resize(m + 1);
- for (int i = 0; i <= m; i++)
- result[i] = 0;
- // FindWay(n, m);
- for (int i = 1; i <= m; i++)
- cout << result[i] << " ";
- }
- int main()
- {
- int n;
- cin >> n;
- GetResult(n);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement