您的位置:首页 > 其它

vijos 1037 ***

2015-07-11 11:56 211 查看
链接:点我

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int v = 2000 + 5;
const int MaxN = 100 + 5;
int N, sum, num[MaxN], dp[2][v];
int main() {
int i, j, k;
cin >> N;
for(i = 0; i < N; ++i) {
cin >> num[i];
sum += num[i];
}
memset(dp, -1, sizeof(dp));
dp[1][0] = 0;
int a;
for(i = 0; i < N; ++i) {
a = i % 2;
memset(dp[a], -1, sizeof(dp[a]));
for(j = 0; j <= sum; ++j) {
//1.不放第i块水晶;
if(dp[a ^ 1][j] > -1)
dp[a][j] = dp[a ^ 1][j];
//2.放进去后,高塔变矮塔(第i块放在矮塔上了);
if(num[i] > j &&  dp[a ^ 1][num[i] - j] > -1)
dp[a][j] = max(dp[a][j], dp[a ^ 1][num[i] - j] + j);
//3.放进去后,高塔仍高(第i块放在矮塔上);
if(j + num[i] <= sum && dp[a ^ 1][j + num[i]] > -1)
dp[a][j] = max(dp[a][j], dp[a ^ 1][j + num[i]]);
//4.放进去后,高塔更高(第i块放在高塔上).
if(j >= num[i] && dp[a ^ 1][j - num[i]] > -1)
dp[a][j] = max(dp[a][j], dp[a ^ 1][j - num[i]] + num[i]);
}
}
if(dp[a][0] > 0)
cout << dp[a][0] << endl;
else
cout << "Impossible" << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: