01背包问题(两种状态)UVa-12563

来源:互联网 发布:淘宝双十一红包群 编辑:程序博客网 时间:2024/06/06 16:30

原题 https://vjudge.net/problem/UVA-12563

对于每移动一步都有两种状态,创建了两个数组来维护状态进行状态转移,也可用一个结构体,这两种状态为结构体的成员函数类似于http://blog.csdn.net/u013480600/article/details/40376143的思路

#include <iostream>#include <cstring>#include <algorithm>using namespace std;int time_[5555] = {0};int dp[255555] = {0};int main(){    int n;    while (cin >> n && n != -1)    {        memset(time_, 0, sizeof(time_));        memset(dp, 0, sizeof(dp));        int index = 0;        int len = 0;        while (n--)        {            int v, c;            cin >> v >> c;            len += v * c;            {                time_[index++] = v;            }            while (c--)        }        for (int i = 0; i < index; i++)        {            for (int j = len / 2; j >= time_[i]; j--)            // for (int j = 0; j <= len / 2; j++)            {                dp[j] = max(dp[j], dp[j - time_[i]] + time_[i]);            }        }        cout << len - dp[len / 2] << " " << dp[len / 2] << endl;    }    return 0;}
原创粉丝点击