放橘子 WA20

↓这是代码↓

#include<bits/stdc++.h>
using namespace std;
int n, k, cnt = 0, a[10] = {0};
void f(int x, int sum){
	if (x > k){
		if (sum == n){
			cnt++;
			return;
		}
	}
	else {
		for (int i = a[x - 1];i <= n - sum;i++){
			if (sum + i <= n){
				a[x] = i;
				f(x + 1, sum + i);
			}
		}
	}
}
int main(){
	int t;
	cin >> t;
	while(t--){
		memset(a, 0, sizeof(a));
		cnt = 0;
		cin >> n >> k;
		f(1, 0);
		cout << cnt << endl;	
	} 
	return 0;
}

把样例下载下来了
一个一个对没看出问题


tip:第一行是样例数,两个数字的是输入,单个数字是输出
↓样例输出↓
10
1
30
8
3
2
30
28
23
10
2
7
18
3
1
2
21
8
3

4 个赞

这道题一看就是需要使用递归,写递归函数首先要确定终止条件:当橘子没有了的时候无论盘子有几个都只有一种方法,当盘子只有一个的时候无论橘子有几个都只有一种方法

如果没到这个终止条件,函数就要继续,因为题目说允许有盘子空着,所以分为两大类:有盘子空着的和没盘子空着的
有盘子空着的话,橘子数量是不变的,而盘子会减少一个,因为那个里面什么都没放

没有盘子空着的话,每次给每个盘子里放一个橘子,这样橘子数量会减少盘子个,而盘子不会变

但是很容易忽略一种特殊情况,也就是橘子数量小于盘子数量的情况。这种情况其实就是橘子数量的橘子放到橘子数量的盘子里,因为每个盘子里放1个橘子这种情况是极端的,最多只会用掉橘子数量个盘子

9 个赞

@LeuR 回老帖 + AC代码