中青班干部培训自我鉴定 党校中青班自我鉴定

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;}


相关文章

专题分类