1192:放苹果
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 11860 通过数: 7167
【题目描述】
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
【输入】
第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
【输出】
对输入的每组数据M和N,用一行输出相应的K。
【输入样例】
1
7 3
【输出样例】
8
广搜
#include<bits/stdc++.h>
#define N 110
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
ll sum,ans,num[N];
void dfs(int step,int m,int n){
if(m==sum) ans++;
else if(step>n) return;
else{
for(int i=1;i<=m;i++){
if(num[step-1]<=i){
sum+=i;
if(sum<=m){
num[step]=i;
dfs(step+1,m,n);
}
sum-=i;
}
}
}
}
int main(){
int t,n,m;
cin>>t;
for(int i=0;i<t;i++){
sum=0;
ans=0;
cin>>m>>n;
dfs(1,m,n);
cout<<ans<<endl;
}
return 0;
}
DP
分类讨论
将dp[m][n]理解为将m个苹果放进n个盘子的分法
1.当m<=1 || n<=1时,只有一种分法
2.当m<n时,剩余的n-m个盘子肯定不会分到苹果,所有dp[m][n]=dp[m][m]
3.当m>=n时,分2种情况,
第一种至少有一个空的盘子,这时为dp[m][n-1]
第二种没有空的盆子,则每个盆子至少有一个苹果,这时为dp[m-n][n]
合并起来dp[m][n]=dp[m][n-1]+dp[m-n][n]
#include<bits/stdc++.h>
#define N 110
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
ll m,n,t,dp[N][N];
int main(){
cin>>t;
for(int k=0; k<t; k++){
ll ans=0;
cin>>m>>n;
memset(dp,0,sizeof(dp));
for(int i=0; i<=m; i++){
for(int j=0; j<=n; j++){
if(i<=1 || j<=1){
dp[i][j]=1;
}
else if(i<j){
dp[i][j]=dp[i][i];
}
else{
dp[i][j]=dp[i-j][j]+dp[i][j-1];
}
}
}
cout<<dp[m][n]<<endl;
}
return 0;
}