中青班干部培训自我鉴定 党校中青班自我鉴定
2023-10-13 05:26:00
来源 : haohaofanwen.com
投稿人 : admin
下面是好好范文网小编收集整理的中青班干部培训自我鉴定 党校中青班自我鉴定,仅供参考,欢迎大家阅读!
引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。
思路1:
这个题目可以使用动态规划的思想来解决。
首先,我们计算出所有水晶的总高度sum。如果sum不能被2整除,那么不可能搭建成一座双塔,直接输出"Impossible"。
然后,我们定义一个二维数组dp,dp[i][j]表示使用前i块水晶,是否能构成一座高度为j的塔。
我们可以初始化dp数组,dp[0][0] = true,表示使用0块水晶可以构成高度为0的塔。
接下来,我们使用动态规划的思想来更新dp数组。对于第i块水晶,我们有两个选择:
不使用第i块水晶,则dp[i][j] = dp[i-1][j]。
使用第i块水晶,则dp[i][j] = dp[i-1][j-h[i]],其中h[i]表示第i块水晶的高度。
我们只需要判断sum/2这一行的最右侧的元素是否为true,即dp[N][sum/2]是否为true。如果是true,则说明可以搭建成一座双塔,输出sum/2,否则输出"Impossible"。
下面是C++的代码实现:
#include<iostream>#include<vector>usingnamespace std;boolisPossible(vector<int>& h, int sum){ int n = h.size(); vector<vector<bool>> dp(n+1, vector<bool>(sum+1, false)); dp[0][0] = true; for (int i = 1; i <= n; i++) { int height = h[i-1]; for (int j = 0; j <= sum; j++) { dp[i][j] = dp[i-1][j]; if (j >= height) { dp[i][j] = dp[i][j] || dp[i-1][j-height]; } } } return dp[n][sum/2];}{ int n; cin >> n; vector<int> h(n); int sum = 0; for (int i = 0; i < n; i++) { cin >> h[i]; sum += h[i]; } if (sum % 2 != 0) { cout << "Impossible" << endl; } else { if (isPossible(h, sum)) { cout << sum/2 << endl; } else { cout << "Impossible" << endl; } } return0;}