放苹果
来源:互联网 发布:ajax请求json数据实例 编辑:程序博客网 时间:2024/05/16 01:16
Language:
放苹果
Time Limit: 1000MS Memory Limit: 10000K
Description
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
17 3
Sample Output
8
Source
lwx@POJ
#include <iostream> //首先,使用递归的思想解决该问题using namespace std;int f(int m,int n){ if(n>m) n=m; if(n==1||m==1||m==0) return 1; return f(m,n-1)+f(m-n,n); //对于m个苹果放在n个盘子里,可以分成两种情况:m个放在n-1个盘子里;m-n个放在n个盘子里。} //解释一下后者,后者实际解决的是,n个盘子中至少有一个苹果的情况,那每个盘子减去一个之后,就变成了m-n个苹果放在n个盘子里的情况了。int main(){ int t; cin>>t; while(t--) { int m,n; cin>>m>>n; cout<<f(m,n)<<endl; } return 0;}
#include <cstdio>#include <cstring>#include <iostream> //介绍dp的解法using namespace std;int dp[11][11];int f1(int m,int n)// 记忆化dp,该解法思路同递归,由递归的思想推出状态转移方程。{if(m<0) return 0;if(dp[m][n]) return dp[m][n];if(n==1||m==0) return 1;dp[m][n]=f1(m-n,n)+f1(m,n-1);return dp[m][n];}void f2(int m,int n)//背包dp,{int i,j,k;int dp[11][11]={0};dp[0][0]=1;for(i=0;i<=m;i++)//多组for(j=1;j<=n;j++)for(k=i;k<=m;k++)//多重dp[j][k]+=dp[j-1][k-i];cout<<dp[n][m]<<endl;}void f3(int m,int n)//f3中dp[i][j]表示i个苹果放入j个箱子,且每个箱子至少放一个的种数{int i,j;int dp[11][11]={0};dp[0][0]=1;for(i=1;i<=m;i++)for(j=1;j<=i;j++)dp[i][j]=dp[i-1][j-1]+dp[i-j][j];int ans=0;for(i=1;i<=n;i++)ans+=dp[m][i];cout<<ans<<endl;}void f4(int m,int n)//f4中dp[i][j]表示i个苹果放入j个箱子,但每个箱子可以为空的种数{int i,j;int dp[11][11]={0};for(i=0;i<=n;i++) dp[0][i]=1;for(i=0;i<=m;i++) dp[i][1]=1;for(i=1;i<=m;i++)for(j=1;j<=n;j++)dp[i][j]=dp[i][j-1]+((i-j>=0)?dp[i-j][j]:0); cout<<dp[m][n]<<endl;}int main(){int cas,m,n;cin>>cas;while(cas--) {cin>>m>>n;memset(dp,0,sizeof(dp));//cout<<"Case f1:";cout<<f1(m,n)<<endl;/*cout<<"Case f2:";f2(m,n); cout<<"Case f3:"; f3(m,n); cout<<"Case f4:"; f4(m,n);*/}return 0;}
#include <iostream>#include <string> //这是DFS方法using namespace std;int t,n,m,s;int num[11];void dfs(int x,int y){ if(x==m) { if(y>=num[m-1]) s++; } else for(int i=num[x-1];i<=y&&(y/(m-x)>=i);i++) { num[x]=i; dfs(x+1,y-i); }} int main(){ scanf("%d",&t); while(t--) { memset(num,0,sizeof(num)); scanf("%d%d",&n,&m); s=0; dfs(1,n); printf("%d\n",s); } return 0;}
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 放苹果
- 在Linux下安装和使用MySQL
- SVN与Git比较
- Win7开机密码破解
- 手机网站如何优化
- step into step over step return的区别
- 放苹果
- Installing Applications on android from your computer
- 大数加法
- php操作符
- RTP/RTSP/RTCP的区别 .
- C语言中的auto、static、register和extern的区别
- 云存储——115网盘
- Fortran与C/C++的混合开发
- 如何打包java project项目