TYVJP1114

来源:互联网 发布:出让股份分配怎么算法 编辑:程序博客网 时间:2024/05/16 09:59

不同步其他博客以前的东西了,从现在开始到以后同步这个好了……

搭建双塔,貌似是非常有名的一道题,OI的
dp[i][j]表示使用前i个水晶块的时候,两座塔的误差为j时两座塔共有的最高高度,对于第i个木块,有三种情况,第一种不放,第二种放在其中挨塔上,此时更新误差值以及共有的最高高度值,第三种情况放在高塔上,此时仅仅更新误差值。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>using namespace std;#define MAX 2500#define MIN -10000int i, n, j, sum[150], a[150], dp[150][MAX], k;int max(int a, int b){if (a > b) return a;else return b;}int main(){scanf("%d", &n);for (i = 1; i <= n; i++){scanf("%d", &a[i]);sum[i] = sum[i - 1] + a[i];}for (i = 0; i <= n; i++)  for (j = 0; j >= 2000; j++)dp[i][j] = -10000;dp[0][0] = 0;for (i = 1; i <= n; i++)  for (j = sum[i]; j >= 0; j--)  {  dp[i][j] = dp[i - 1][j];  if (a[i] >= j)dp[i][j] = max(dp[i][j], max(dp[i - 1][a[i] - j] + j, dp[i - 1][a[i] + j]));  else dp[i][j] = max(dp[i][j], max(dp[i - 1][j - a[i]] + a[i], dp[i - 1][a[i] + j]));  }k = -1;for (i = 1; i <= n; i++)  if (dp[i][0] > k) k = dp[i][0];if (k > 0) printf("%d\n", k);else printf("Impossible\n");return 0;}

PS:千万别用cin和cout,会超时……