算法12-分配司机求最大收入

题目:
给出一个二维数组i[0][1],表示第i位司机在A区的收入和B去的收入,求如何平均分配,使得所有司机总收入最高,返回最高收入

分析:动态规划
1,平分,司机的人数必须是偶数,如果数组长度不是偶数直接返回0
2 我们只需关注一个区A的分配情况,定义A区剩余名额为rest,如果剩余人数等于rest,将剩余的全部分给A,
3 如果rest=0,说明A区分配满了,那就把剩余人数全部给B
4,对于当前i的司机,比较分配给A的收入和B的收入,取较大的值分派

代码:

package main
import(
	"fmt"
	"math/rand"
	"time"
)
//接受二维矩阵i[0][1],代表index的司机去A地区服务的收入i[0]和去B地区服务的收入i[1]
func maxmoney(list [][]int) int{
	n:=len(list)
	if n/2 !=0 ||n<2 {//n必须是偶数,才能平分,A地区n/2,B地区n/2
		return 0
	}
	m:=n/2//要去A区域的司机

	return process(list,0,m)
}
//i之后的司机往a和b分配
//a区域还有rest个名额
//返回所有司机分配到a和b的最大收入
func process(list [][]int, i int,rest int)int{
	if i==len(list){
		return 0
	}
	//A区还剩下名额等于还没有分配的司机,都去a区
	if len(list)-i==rest{
		return list[i][0]+process(list,i+1,rest-1)
	}
	//a区名额满了,都去B区
	if rest==0{
		return list[i][1]+process(list,i+1,rest)
	}
	//当前idx,去a区或者b区
	p1:=list[i][0]+process(list,i+1,rest-1)
	p2:=list[i][1]+process(list,i+1,rest)
	//哪个大返回哪个
	if p1<p2{
		return p2
	}else{
		return p1
	}
}



func main(){
	var list [][]int



	for i:=0;i<10;i++{
		rand.Seed(time.Now().UnixNano())
		num := rand.Intn(50)+10
		time.Sleep(1*time.Millisecond)
		num1 := rand.Intn(50)+10

		tmp:=[]int{num,num1}
		list=append(list,tmp)
	}
	// fmt.Println(list)

	fmt.Println(process(list,0,2))

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值