动态规划

收割地块最大收益

一台收割机收割给不同地块收割获得的钱不同,同时耗费的油量也不同,以下是 6 个地块的耗油量和收益的列表[(1, 1), (7, 9), (6, 10), (2, 4), (3, 5), (6, 10)],请问收割机在给定油量 n=10 (n≥1)的情况下,如何尽可能赚到更多的钱?

提示:

  • 使用动态规划,从第一个地块开始计算油量 dp[1]获得最多收益,再一次计算油量 dp[n]的最多收益。
  • 上述答案为 16 。
func main() {
	fuel := []int{1, 7, 6, 2, 3, 6}
	profit := []int{1, 9, 10, 4, 5, 10}
	total := 10

	maxProfit := dp(fuel, profit, total)
	fmt.Println(maxProfit)
}

func dp(fuel, profit []int, total int) int {
	// 首先初始化一个二维数组
	dp := make([][]int, len(fuel)+1)
	for i := range dp {
		dp[i] = make([]int, total+1)
	}

	// 状态转移方程
	for i := 1; i <= len(fuel); i++ {
		for j := 1; j <= total; j++ {
			// 不选择收割当前地块
			noChoose := dp[i-1][j]

			// 选择收割当前地块
			choose := 0
			if j >= fuel[i-1] {
				choose = profit[i-1] + dp[i-1][j-fuel[i-1]]
			}

			dp[i][j] = max(noChoose, choose)
		}
	}
	return dp[len(fuel)][total]
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
最后更新于