2022-01-26:最优账单平衡。 一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-01-26:最优账单平衡。 一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x相关的知识,希望对你有一定的参考价值。

2022-01-26:最优账单平衡。
一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x, y, z) 表示一次交易,表示 x 借给 y 共计 z 美元。用 0, 1, 2 表示小爱同学、小新同学和小明同学(0, 1, 2 为人的标号),上述交易可以表示为 [[0, 1, 10], [2, 0, 5]]。
给定一群人之间的交易信息列表,计算能够还清所有债务的最小次数。
注意:
一次交易会以三元组 (x, y, z) 表示,并有 x ≠ y 且 z > 0。
人的标号可能不是按顺序的,例如标号可能为 0, 1, 2 也可能为 0, 2, 6。
力扣465。

答案2022-01-26:

状态压缩的动态规划。

代码用golang编写。代码如下:

package main

import "fmt"

func main() 
    trans := [][]int0, 1, 10, 1, 0, 1, 1, 2, 5, 2, 0, 5
    ret := minTransfers2(trans)
    fmt.Println(ret)


func minTransfers2(transactions [][]int) int 
    debt := debts(transactions)
    fmt.Println(debt)
    N := len(debt)
    sum := 0
    for _, num := range debt 
        sum += num
    
    dp := make([]int, 1<<N)
    for i := 0; i < 1<<N; i++ 
        dp[i] = -1
    
    return N - process2(debt, (1<<N)-1, sum, N, dp)


func process2(debt []int, set, sum, N int, dp []int) int 
    if dp[set] != -1 
        return dp[set]
    
    ans := 0
    if (set & (set - 1)) != 0 
        value := 0
        max := 0
        for i := 0; i < N; i++ 
            value = debt[i]
            if (set & (1 << i)) != 0 
                max = getMax(max, process2(debt, set^(1<<i), sum-value, N, dp))
            
        
        ans = twoSelectOne(sum == 0, max+1, max)
    
    dp[set] = ans
    return ans


func debts(transactions [][]int) []int 
    map0 := make(map[int]int)
    for _, tran := range transactions 
        map0[tran[0]] += tran[2]
        map0[tran[1]] -= tran[2]
    
    N := 0
    for _, value := range map0 
        if value != 0 
            N++
        
    
    debt := make([]int, N)
    index := 0
    for _, value := range map0 
        if value != 0 
            debt[index] = value
            index++
        
    
    return debt


func getMax(a, b int) int 
    if a > b 
        return a
     else 
        return b
    


func twoSelectOne(c bool, a, b int) int 
    if c 
        return a
     else 
        return b
    

执行结果如下:


左神java代码

以上是关于2022-01-26:最优账单平衡。 一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x的主要内容,如果未能解决你的问题,请参考以下文章

博弈论小课堂:零和博弈(找到双方的平衡点)

P1337 [JSOI2004]平衡点 / 吊打XXX

DBA推广介绍,社区介绍,玩家信息修改,个人账单查询

hdu 5693 朋友 博弈

ACM集训的第一题

老外也爱修仙?一群歪果仁开始在Steam上求《鬼谷八荒》英文版了…