ACW278.数字组合-01背包求方案数
1. 题目
给定
输入格式
第一行包含两个整数
输出格式
包含一个整数,表示可选方案数。
数据范围
答案保证在 int 范围内。
输入样例
4 4
1 1 2 2
输出样例
3
2. 思路
- 经典的
01
背包问题求方案数,每个物品不可以重复选取 - 假定
f[i]
为容积恰好为f[i]
,且完全放满需要的方案数。 - 那么
f[i] = f[i] + f[i-curVol]
3. 代码
go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
var n, m int
fmt.Fscan(in, &n, &m)
var arr = make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &arr[i])
}
f := make([]int, m+1)
f[0] = 1
for i := 0; i < n; i++ {
currentNum := arr[i]
for k := m; k >= currentNum; k-- {
f[k] += f[k-currentNum]
}
}
fmt.Println(f[m])
}