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

全部博文(21)

文章存档

2013年(16)

2012年(5)

我的朋友

分类: C/C++

2013-03-26 13:23:03

题目:往手镯上镶嵌宝石,当然所嵌宝石的总重量是有上限的,要求所嵌宝石的总价值最大。这其实就是一个01背包问题。
链接:

思路:设M为总重量上限,一共有n颗宝石,那么开一个数组记录各个状态state[n][M+1]
        state[i][j] = max {state[i-1][j], state[i-1][j-wi]}, 其实就是选择要或者不要第二颗宝石。
时间复杂度为O(M*n),当然空间是可以降下来的。

我一开始忘记吧第M+1个状态copy过去,就一直WA,真是脑残啊。

上代码

点击(此处)折叠或打开

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

  4. using namespace std;

  5. #define MAX 12881

  6. int state[2][MAX];

  7. int N, M;

  8. int dp() {
  9.     int w, d;
  10.     int pre, cur;
  11.     memset(state, 0, sizeof(state));
  12.     for (int i=0; i<N; i++) {
  13.         cin >> w >> d;
  14.         pre = (i + 1) % 2;
  15.         cur = i % 2;
  16.         memcpy(state[cur], state[pre], sizeof(int)*(M+1));
  17.         for (int k=1; k<=M-w; k++) {
  18.             if (state[pre][k] > 0 &&
  19.                     state[pre][k+w] < state[pre][k] + d) {
  20.                 state[cur][k+w] = state[pre][k] + d;
  21.             }
  22.         }
  23.         if (state[cur][w] < d)
  24.             state[cur][w] = d;
  25.     }
  26.     int max = 0;
  27.     for (int k=1; k<=M; k++)
  28.         if (max < state[cur][k])
  29.             max = state[cur][k];

  30.     return max;
  31. }

  32. int main() {
  33.     while (cin >> N >> M)
  34.         cout << dp() << endl;
  35.     return 0;
  36. }

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

上一篇:POJ1088

下一篇:POJ1157解题报告

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