这样的题一般有DP的解法,感兴趣的同学自己想想;
// 这里给byte类型的切片排序
type result struct{
value []byte
}
func (r *result) Len() int{
return len(r.value)
}
func (r *result) Less(i,j int) bool{
return r.value[i] > r.value[j]
}
func (r *result) Swap(i,j int) {
r.value[i] ,r.value[j] = r.value[j], r.value[i]
}
func newResult(s string) *result{
return &result{
value: []byte(s),
}
}
// 保存生成的结果
var resultMap map[string]struct{}
func ans(num, sum int,str string) {
if num == sum {
// 这里为了去重
r := newResult(str)
//fmt.Println(string(r.value)) //调试打印
sort.Sort(r)
resultMap[string(r.value)] = struct{}{}
return
}
if condition('1', str, 10){
ans(num+1, sum, str+ "1")
}
if condition('2', str, 10){
ans(num+1, sum, str+ "2")
}
if condition('3', str, 10){
ans(num+1, sum, str+ "3")
}
if condition('4', str, 10){
ans(num+1, sum, str+ "4")
}
if condition('5', str, 10){
ans(num+1, sum, str+ "5")
}
if condition('6', str, 10){
ans(num+1, sum, str+ "6")
}
if condition('7', str, 10){
ans(num+1, sum, str+ "7")
}
if condition('8', str, 10){
ans(num+1, sum, str+ "8")
}
if condition('9', str, 10){
ans(num+1, sum, str+ "9")
}
if condition('a', str, 10){
ans(num+1, sum, str+ "a")
}
}
// 限制条件,每个元素不能超过10
func condition(b byte , str string, threshold int) bool{
count := 0
for i := range str{
if str[i] == b{
count++
}
}
if count >= threshold{
return false
}
return true
}
func main(){
resultMap = make(map[string]struct{})
ans(0, 20, "")
fmt.Println(len(resultMap))
}