数的划分
Description
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3 (6<n<=200,2<=k<=6),下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
Input
n,k
Output
一个整数,即不同的分法。
Sample Input
7 3
Sample Output
4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
解题思路
用f[i][j]来表示把j分成i份时的最优解
f[i][j]=f[i][j-i]+f[i-1][j-1]
代码
#include<cstdio>
int n,k,a[10][205];
int main()
{scanf("%d%d",&n,&k);a[0][0]=1;for (int i=1;i<=k;i++)
for (int j=i;j<=n;j++)a[i][j]=a[i][j-i]+a[i-1][j-1];printf("%d",a[k][n]);
}
鸣人的影分身
描述
在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。
影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。
针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。
那么问题来了,假设鸣人的查克拉能量为M,他影分身的个数为N,那么制造影分身时有多少种(用K表示)不同的分配方法?(影分身可以被分配到0点查克拉能量)
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8
解题思路
这道题数据小的不行,我们可以用数的划分的方法,只不过是把分成1-m份的和加起来而已。
代码
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,a[15][15],maxs,t,e;
int main()
{scanf("%d",&t);for (int ti=1;ti<=t;ti++){maxs=0;scanf("%d%d",&n,&e);for (int k=1;k<=e;k++){memset(a,0,sizeof(a));a[0][0]=1;for (int i=1;i<=k;i++)for (int j=i;j<=n;j++)a[i][j]=a[i][j-i]+a[i-1][j-1];maxs+=a[k][n];}printf("%d\n",maxs);}
}