递推
题意:给出n和k,用k个数字(可以相同)使他们的和为n,问有多少种方案数,其中好像a+b,b+a这种算为两种方案,也就是考虑排列
这个问题用递推来做,按位递推。dp[c][s]表示在利用c个数字的条件下相加得s的方案数
dp[c][s]=dp[c-1][s]+dp[c-1][s-1]+dp[c-1][s-2]……dp[c-1][0]
另外需要初始化
无论多少位,相加和位0的话方案数是1,即全部为0,所以dp[c][0]=1
另外当只有一个数字时要相加和为s,方案数也是1,即只能填s本身,dp[1][s]=1
然后就可以开始递推了
我是用记忆化搜索来写的
#include <cstdio> #include <cstring> #define MOD 1000000 #define N 110 long long dp[N][N]; int n,m; void dfs(int c , int s) //dp[c][s]在c位内构建出s { if(dp[c][s]!=-1) return ; dp[c][s]=0; for(int i=0; i<=s; i++) //当前位能填的数字 { dfs(c-1,s-i); //在剩下的c-1位中要构建出s-i dp[c][s]=(dp[c][s]+dp[c-1][s-i])%MOD; } return ; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(!n && !m) break; memset(dp,-1,sizeof(dp)); for(int i=1; i<=m; i++) dp[i][0]=1; //要构建出0的方案数必定为1 for(int i=0; i<=n; i++) dp[1][i]=1; //当只有1位时构建的方案数也是1,唯一的 dfs(m,n); printf("%lld\n",dp[m][n]); } return 0; }