Merge pull request #1132 from ronething/patch-1

Update 背包问题理论基础多重背包.md
This commit is contained in:
程序员Carl
2022-03-21 10:22:01 +08:00
committed by GitHub

View File

@ -245,7 +245,94 @@ if __name__ == '__main__':
Go
```go
package theory
import "log"
// 多重背包可以化解为 01 背包
func multiplePack(weight, value, nums []int, bagWeight int) int {
for i := 0; i < len(nums); i++ {
for nums[i] > 1 {
weight = append(weight, weight[i])
value = append(value, value[i])
nums[i]--
}
}
log.Println(weight)
log.Println(value)
res := make([]int, bagWeight+1)
for i := 0; i < len(weight); i++ {
for j := bagWeight; j >= weight[i]; j-- {
res[j] = getMax(res[j], res[j-weight[i]]+value[i])
}
log.Println(res)
}
return res[bagWeight]
}
```
> 单元测试
```go
package theory
import "testing"
func Test_multiplePack(t *testing.T) {
type args struct {
weight []int
value []int
nums []int
bagWeight int
}
tests := []struct {
name string
args args
want int
}{
{
name: "one",
args: args{
weight: []int{1, 3, 4},
value: []int{15, 20, 30},
nums: []int{2, 3, 2},
bagWeight: 10,
},
want: 90,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := multiplePack(tt.args.weight, tt.args.value, tt.args.nums, tt.args.bagWeight); got != tt.want {
t.Errorf("multiplePack() = %v, want %v", got, tt.want)
}
})
}
}
```
> 输出
```
=== RUN Test_multiplePack
=== RUN Test_multiplePack/one
2022/03/02 21:09:05 [1 3 4 1 3 3 4]
2022/03/02 21:09:05 [15 20 30 15 20 20 30]
2022/03/02 21:09:05 [0 15 15 15 15 15 15 15 15 15 15]
2022/03/02 21:09:05 [0 15 15 20 35 35 35 35 35 35 35]
2022/03/02 21:09:05 [0 15 15 20 35 45 45 50 65 65 65]
2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 65 80 80]
2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80]
2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80]
2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 90]
--- PASS: Test_multiplePack (0.00s)
--- PASS: Test_multiplePack/one (0.00s)
PASS
```
-----------------------