放蘋果、數字劃分(dfs)
阿新 • • 發佈:2018-12-01
放蘋果
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 Sample Output Source |
#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
樣例輸出1
4
限制
每個測試點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; }