放苹果 - 题解
放苹果
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB描述
把 \(M\) 个同样的苹果放在 \(N\) 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)\(5,1,1\) 和 \(1,5,1\) 是同一种分法。
输入描述
第一行是测试数据的数目 \(t\)(\(0≤t≤20\))。
以下每行均包含二个整数 \(M\) 和 \(N\),以空格分开。\(1≤M,N≤10\)。输出描述
对输入的每组数据 \(M\) 和 \(N\),用一行输出相应的 \(K\)。
用例输入 1
1 7 3 用例输出 1
8 提示
代码
递归 做法
#include<cstdio> using namespace std; int ans=0; void solve(int m,int n,int p,int last) { if(m<0) return; if(p==n) { if(m>=last) ans++; } else { for(int i=last;i<=m;i++) solve(m-i,n,p+1,i); } return; } int main() { int t; scanf("%d",&t); while(t--) { int m,n; scanf("%d%d",&m,&n); ans=0; solve(m,n,1,0); printf("%d\n",ans); } return 0; }
动态规划 做法
#include<cstdio> #include<cstring> using namespace std; const int M=15,N=15; int T,m,n,f[M][N]; int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); memset(f,0,sizeof(f)); for(int i=1;i<=m;i++) f[i][1]=1; for(int i=1;i<=n;i++) f[0][i]=f[1][i]=1; for(int i=2;i<=m;i++) for(int j=2;j<=n;j++) { if(i>=j) f[i][j]=f[i][j-1]+f[i-j][j]; else f[i][j]=f[i][i]; } printf("%d\n",f[m][n]); } return 0; }
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/18331308
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步