golang 算法课 给定20个一样的球放到10个不一样的桶,每个桶最多放10个 有多少种放法 暴力搜索法

这样的题一般有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))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值