Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97532
  • 博文数量: 21
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-22 17:37
文章分类

全部博文(21)

文章存档

2013年(16)

2012年(5)

我的朋友

分类: C/C++

2013-04-03 21:03:53

原题:思路:|D-P|尽可能的小,而D+P尽可能的大。
显然|D-P|是没有最优子结构的,但是 0<=D,P<=20,而 1<=M<=20,所以可以
枚举|D-P|的值,-400<=D-P<=400,所以可以用数组 
state[M+1][801]记录所以的情况。每来一个候选人,更新所有的记录和路径,
D+P根据题目要求是有最优结构的。类似于背包问题。


关键这道题目要求打印组合形式,我就暴力开数组记录每个状态的路径来完成,肯定
有好方法。
还有,要当心 D,P == 0的情况。

代码:

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <cstring>

  3. using namespace std;

  4. #define N 201
  5. #define M 21
  6. #define MAX 801
  7. #define BIAS 400

  8. struct Node {
  9.     bool valid;
  10.     int sum;
  11.     int id[M];
  12. };

  13. Node state[M][MAX];
  14. int m, n;
  15. int array[N][2];

  16. void init() {
  17.     for (int i=1; i<=n; i++)
  18.         cin >> array[i][0] >> array[i][1];
  19.     memset(state, 0, sizeof(state));
  20.     state[0][BIAS].valid = true;
  21. }

  22. int dp() {
  23.     for (int i=1; i<=n; i++) {
  24.         int diff = array[i][0] - array[i][1];
  25.         int sum = array[i][0] + array[i][1];
  26.         for (int j=m; j>0; j--) {
  27.             for (int x=0; x<MAX; x++) {
  28.                 if (state[j-1][x].valid) {
  29.                     if (state[j-1][x].sum + sum >= state[j][x+diff].sum) {
  30.                         state[j][x+diff].sum = state[j-1][x].sum + sum;
  31.                         for (int index=1; index<j; index++)
  32.                             state[j][x+diff].id[index] = state[j-1][x].id[index];
  33.                         state[j][x+diff].id[j] = i;
  34.                         state[j][x+diff].valid = true;
  35.                     }
  36.                 }
  37.             }
  38.         }
  39.     }
  40.     for (int i=0; i<=BIAS; i++)
  41.         if (state[m][BIAS+i].valid || state[m][BIAS-i].valid) {
  42.             int maxSum = -1;
  43.             if (state[m][BIAS+i].valid)
  44.                 maxSum = state[m][BIAS+i].sum;
  45.             if (state[m][BIAS-i].valid && state[m][BIAS-i].sum > maxSum)
  46.                 return BIAS-i;
  47.             return BIAS+i;
  48.         }
  49. }

  50. int main() {
  51.     int id = 0;
  52.     while (cin >> n >> m) {
  53.         if (n == 0 && m == 0)
  54.             return 0;
  55.         id++;
  56.         init();
  57.         int diff = dp();
  58.         cout << "Jury #" << id << endl;
  59.         cout << "Best jury has value "
  60.             << ((state[m][diff].sum+diff-BIAS)/2)
  61.             << " for prosecution and value "
  62.             << ((state[m][diff].sum-diff+BIAS)/2)
  63.             << " for defence:\n";
  64.         for (int i=1; i<=m; i++)
  65.             cout << " " << state[m][diff].id[i];
  66.         cout << endl;
  67.         cout << endl;
  68.     }
  69.     return 0;
  70. }


阅读(973) | 评论(0) | 转发(0) |
0

上一篇:POJ1050解题报告

下一篇:POJ1159解题报告

给主人留下些什么吧!~~