1. 程式人生 > >放蘋果、數字劃分(dfs)

放蘋果、數字劃分(dfs)

 

 

放蘋果

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 38077   Accepted: 23401

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

1
7 3

Sample Output

8

Source

[email protected]

[Submit]   [Go Back]

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
int m,n;
int ans;
using namespace std;
void dfs(int cnt,int left,int num)
{
 if(left==0)
    ans++;
   else for(int i=min(left,num);i>=(left-1)/(n-cnt)+1;i--)
       dfs(cnt+1,left-i,i);
}
int main()
{
   int t;
   scanf("%d",&t);
   while(t--)
   {ans=0;
       scanf("%d%d",&m,&n);
       dfs(0,m,1000);

   printf("%d\n",ans);
   }
   return 0;
}

數字劃分

描述

將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。

例如:n=7,k=3,下面三種分法被認為是相同的。

1,1,5; 1,5,1; 5,1,1;
問有多少種不同的分法。

格式

輸入格式

輸入n,k (6<n<=200,2<=k<=6)

輸出格式

一個整數,即不同的分法。

樣例1

樣例輸入1

7 3

Copy

樣例輸出1

4

Copy

限制

每個測試點1s

來源

NOIP2001第二題

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
int m,n;
int ans;
using namespace std;
void dfs(int cnt,int left,int num)
{

    if(cnt==n)
    {
        ans++;
        return ;
    }
     if(left==0)
    return ;
    for(int i=min(left,num);i>=(left-1)/(n-cnt)+1;i--)
       dfs(cnt+1,left-i,i);
}
int main()
{
   int t;
  ans=0;
       scanf("%d%d",&m,&n);
       dfs(0,m,1000);

   printf("%d\n",ans);

   return 0;
}