带权活动安排问题,求最大价值和对应的行动

n个活动,有起始时间和价值,时间不冲突的情况下的最大价值和对应的策略,

package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func main() {
	arr := [][]int{
		{1, 4, 5},
		{3, 5, 1},
		{0, 6, 8},
		{4, 7, 4},
		{3, 8, 6},
		{5, 9, 3},
		{6, 10, 2},
		{8, 11, 4},
	}
	sort.Slice(arr, func(i, j int) bool {
		if arr[i][1] == arr[j][1] {
			return arr[i][0] < arr[j][0]
		}
		return arr[i][1] < arr[j][1]
	})
	n := len(arr)
	dp := make([]int, n+1)
	choose := make([]int, n+1)
	prev := make([]int, n+1)
	for i := 1; i <= n; i++ {
		dp[i] = max(dp[i-1], arr[i-1][2])
		if dp[i-1] <= arr[i-1][2] {
			choose[i] = 1
		}
		for j := 1; j < i; j++ {
			if arr[j-1][1] > arr[i-1][0] {
				break
			} else {
				if dp[i] < max(dp[i], dp[j]+arr[i-1][2]) {
					dp[i] = max(dp[i], dp[j]+arr[i-1][2])
					choose[i] = 1
					prev[i] = j
				}

			}
		}
	}

	cur := n
	for ; choose[cur] != 1; cur-- {
	}
	track := make([]string, 0)
	for {
		track = append([]string{strconv.Itoa(cur)}, track...)
		cur = prev[cur]
		if cur == 0 {
			break
		}
	}
	ans := strings.Join(track, " ")
	fmt.Printf("%2v\n", dp)     //[ 0  5  5  8  9  9  9 10 13]
	fmt.Printf("%2v\n", choose) //[ 0  1  0  1  1  0  0  1  1]
	fmt.Printf("%2v\n", prev)   //[ 0  0  0  0  1  0  0  3  4]
	fmt.Println(ans)				   //1 4 8
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

posted @   Notomato  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示