题目:
给出一个二维数组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))
}