张瀚文
(天域_awa)
1
↓这是代码↓
#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 个赞
tyx
(༺༺■̵̶̸̸̴̴̷̩͎̬͍̙͎͕͎̩͍͇̜͍̯̖͎̙͓̪͎͓̜̟͖͈̩͈̜̮̝̠̫̠͉̘̳̳̦͈͇̖͓̩͙̩̤͇̠̠̣͔͕̲͍̪̮̥̗̦͍͇͍͖̟͔͔̲̜̗̱̤̲̤̱̝̟͇̖͔̮͙̣͚̗̣̤̱͇͖̪͚͉̜̫̤̮͎̖̥͙̜̖̞̥͔͍̳͙̉̃̀͑͗͋̾̔̓̄̆̐̾͊̐̀̆̆̋̎̂̓̈̆̑͋͛̐̍̾̎͐̈́͋̌̾̓̌̂̿͗̂̂͗̊̇͛̾̋͂͒̉̿̾̽͛̈́̍̋͗̐͒͂̊̾͒̃̎̇͐̎̇́̅̈́͂̋̑͒́̓͆̅̓͌͗͋̏͒̽̒̉̂̔̒͆̊̐̀̈́̀͒̽̚̚ͅͅ҉再见,匹诺康尼_C++CodeIkun༻༻)
2
这道题一看就是需要使用递归,写递归函数首先要确定终止条件:当橘子没有了的时候无论盘子有几个都只有一种方法,当盘子只有一个的时候无论橘子有几个都只有一种方法
如果没到这个终止条件,函数就要继续,因为题目说允许有盘子空着,所以分为两大类:有盘子空着的和没盘子空着的
有盘子空着的话,橘子数量是不变的,而盘子会减少一个,因为那个里面什么都没放
没有盘子空着的话,每次给每个盘子里放一个橘子,这样橘子数量会减少盘子个,而盘子不会变
但是很容易忽略一种特殊情况,也就是橘子数量小于盘子数量的情况。这种情况其实就是橘子数量的橘子放到橘子数量的盘子里,因为每个盘子里放1个橘子这种情况是极端的,最多只会用掉橘子数量个盘子
9 个赞