poj1664(放苹果)
生活随笔
收集整理的這篇文章主要介紹了
poj1664(放苹果)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://poj.org/problem?id=1664
?關于放蘋果的那些事。。。。。。。。。。
?? 今天偶然看到一個關于整數劃分的算法, 仔細看了后,我想到了放蘋果的事,其實這個問題困擾了我很久,一直沒想明白放蘋果的原理。記得當時做這個題的時候,自己的分析的方法和整數劃分的算法是一樣的,就是沒想到用遞歸就能做出來,看了一位dn的博客,終于明白是怎么回事了.........
例子,?
?整數劃分的思想如下: 整數劃分問題是將一個正整數n拆成一組數連加并等于n的形式,且這組數中的最大加數不大于n。如6的整數劃分為
6
5 + 1
4 + 2, 4 + 1 + 1
3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1
2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1
共11種。下面介紹一種通過遞歸方法得到一個正整數的劃分數。
遞歸函數的聲明為 int split(int n, int m);其中n為要劃分的正整數,m是劃分中的最大加數(當m > n時,最大加數為n),
1 當n = 1或m = 1時,split的值為1,可根據上例看出,只有一個劃分1 或 1 + 1 + 1 + 1 + 1 + 1
可用程序表示為if(n == 1 || m == 1) return 1;
2 下面看一看m 和 n的關系。它們有三種關系
(1) m > n
在整數劃分中實際上最大加數不能大于n,因此在這種情況可以等價為split(n, n);
可用程序表示為if(m > n) return split(n, n);
(2) m = n
這種情況可用遞歸表示為split(n, m - 1) + 1,從以上例子中可以看出,就是最大加
數為6和小于6的劃分之和
用程序表示為if(m == n) return (split(n, m - 1) + 1);
(3) m < n
這是最一般的情況,在劃分的大多數時都是這種情況。
從上例可以看出,設m = 4,那split(6, 4)的值是最大加數小于4劃分數和整數2的劃分數的和。
即 split(6,4) = split(6,3) + split(2,4)
因此,split(n, m)可表示為split(n, m - 1) + split(n - m, m)
?? ??? 按照整數劃分的思想,將一個整數劃分為若干(x<=n) 整數,按由大到小逐級遞減的順序排列,? 這樣保證了不會出現 5,1,1 和 1,5,1 這種想同的情況,根據這樣的思路來建立一個遞推關系。
以前用dfs寫的代碼 #include"iostream"using namespace std;
int count=0;
int M,m,n;
void DFS(int k, int s,int t)
{
if( s==n ){
if(t==m) count++;
return ;
}
int i;
for(i=k;i>=0; i--){
if( t + i <= m )
{
DFS(i, s+1, t+i);
}
else
{
continue;
}
}
}
int main()
{
int i;
scanf("%d",&M);
while(M--)
{
count=0;
scanf("%d %d",&m, &n);
for(i=m;i>=0;i--)
{
DFS(i,1,i);
}
printf("%d\n",count);
}
return 0; ?遞推法 #include"iostream"
using namespace std;
int split(int n, int m)
{
if(n==1||m==1) return 1;
else
{
if(m>n)
{
return split(n , n);
}
if(m==n) return split(n ,m-1)+1;
if(m<n)
{
return split(n , m-1)+split(n-m , m);
}
}
}
int main()
{
int t,m,n;
cin>>t;
while(t--)
{
cin>>m>>n;
cout<<split(m , n)<<endl;;
}
return 0;
} 看來要向別人學習的地方還很多啊。。。。 努力
轉載于:https://www.cnblogs.com/FCWORLD/archive/2011/04/13/2015312.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的poj1664(放苹果)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [数论]拓展中国剩余定理
- 下一篇: foj2014