algorithm - 加权事件选择

标签 algorithm dynamic-programming

我被这个问题困扰了几天-

Consider a modification to the activity-selection problem in which each activity ai has, in addition to a start and finish time, a value vi. The objective is no longer to maximize the number of activities scheduled, but instead to maximize the total value of the activities scheduled. That is, we wish to choose a set A of compatible activities such that summation of their corresponding values is maximized. Give a polynomial-time algorithm for this problem.

我知道这个问题已经得到回答here &我设计了一种 DP 方法来找出值的总和。但是您可以打印所选的事件吗?

最佳答案

C++代码如下。希望您能轻松地将其翻译成任何其他语言。

#include <cstdio>
#include <algorithm>

using namespace std;

#define N 1000

struct activity
{
    int start;
    int finish;
    int weight;
};

bool comp(activity m, activity n)
{
    return m.finish>n.finish;
}

int dp[N];

int main()
{
    int n, maxi=-1;
    int DP[N];
    activity a[N];
    scanf("%d", &n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d %d", &a[i].start, &a[i].finish, &a[i].weight);
        a[i].pos=i+1;
    }
    sort(a, a+n, comp);
    for(int i=0; i<n; i++)
        dp[i]=a[i].weight;
    for(int i=1; i<n; i++)
    {
        for(int j=0; j<i; j++)
        {
            if(a[j].finish<=a[i].start)
                dp[i]=max(dp[i], dp[j]+a[i].weight);
            maxi=max(dp[i], maxi);
        }
    }
    printf("%d\n", maxi);
    int act[N];
    int k=0;
    for(int i=n-1;i>=0;i--)
    {
        if(dp[i]==maxi)
        {
            maxi-=a[i].weight;
            act[k++]=a[i].pos;
        }
    }
    for(int i=k-1;i>=0;i--)
        printf("%d ", act[i]);

    return 0;
}

关于algorithm - 加权事件选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39693094/

相关文章:

algorithm - 优化DNF谜题的SAT约束

javascript - 背包 - 从总值(value)中确定集合

algorithm - 扭曲背包问题(无界斐波那契约束)

dynamic-programming - DP问题,连续线段的最佳分割

java - 动态规划 - 做出改变

python - 如何从递归函数中获取数据?

algorithm - 我应该采取什么步骤来识别这个算法

比较想法相似性的算法(作为字符串)

algorithm - 需要想法使用优先级队列在数据结构中自定义算法

java - 我应该如何找到重复的单词序列