AcWing 1050. 鸣人的影分身
原题链接
中等
作者:
冷丁Hacker
,
2020-10-30 15:23:48
,
所有人可见
,
阅读 357
DP
#include<bits/stdc++.h>
using namespace std;
int t, n, m;
int f[15][15];
int main()
{
cin >> t;
f[0][0] = 1;
while (t--) {
cin >> m >> n;
memset(f, 0, sizeof(f));
f[0][0] = 1;
for (int i = 0; i <= m; i++) {
for (int j = 1; j <= n; j++) {
f[i][j] = f[i][j-1];
if (i >= j) {
f[i][j] += f[i - j][j];
}
}
}
cout << f[m][n] << endl;
}
return 0;
}
dfs
#include<bits/stdc++.h>
using namespace std;
int t, m, n;
int ans;
/*
本题有两个难点
防止遍历重复的方案,要求位置后面放的数字一定要大于等于位置前面放的数字
因此用start记录 前一个数字,i从start开始枚举
第二个剪枝 枚举到t t是剩余的能量 所以枚举到t 就减少了那些超过能量之外的情况了
*/
void dfs(int t, int start, int cnt) {
if (cnt == n) {
if (t == 0) {
ans++;
}
}
if (cnt >= n)
return;
for (int i = start; i <= t; i++) {
dfs(t - i, i, cnt + 1);
}
}
int main()
{
cin >> t;
while (t--) {
ans = 0;
cin >> m >> n;
dfs(m, 0, 0);
cout << ans << endl;
}
return 0;
}