日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

poj1664(放苹果)

發(fā)布時(shí)間:2024/9/5 编程问答 82 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj1664(放苹果) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:http://poj.org/problem?id=1664

?關(guān)于放蘋(píng)果的那些事。。。。。。。。。。

?? 今天偶然看到一個(gè)關(guān)于整數(shù)劃分的算法, 仔細(xì)看了后,我想到了放蘋(píng)果的事,其實(shí)這個(gè)問(wèn)題困擾了我很久,一直沒(méi)想明白放蘋(píng)果的原理。記得當(dāng)時(shí)做這個(gè)題的時(shí)候,自己的分析的方法和整數(shù)劃分的算法是一樣的,就是沒(méi)想到用遞歸就能做出來(lái),看了一位dn的博客,終于明白是怎么回事了.........

例子,?

?整數(shù)劃分的思想如下: 整數(shù)劃分問(wèn)題是將一個(gè)正整數(shù)n拆成一組數(shù)連加并等于n的形式,且這組數(shù)中的最大加數(shù)不大于n。
如6的整數(shù)劃分為

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種。下面介紹一種通過(guò)遞歸方法得到一個(gè)正整數(shù)的劃分?jǐn)?shù)。

遞歸函數(shù)的聲明為
int split(int n, int m);其中n為要?jiǎng)澐值恼麛?shù),m是劃分中的最大加數(shù)(當(dāng)m > n時(shí),最大加數(shù)為n),
1 當(dāng)n = 1或m = 1時(shí),split的值為1,可根據(jù)上例看出,只有一個(gè)劃分1 或 1 + 1 + 1 + 1 + 1 + 1
可用程序表示為if(n ==
1 || m == 1) return 1;

2 下面看一看m 和 n的關(guān)系。它們有三種關(guān)系
(
1) m > n
在整數(shù)劃分中實(shí)際上最大加數(shù)不能大于n,因此在這種情況可以等價(jià)為split(n, n)
;
可用程序表示為if(m > n) return split(n, n);
(2) m = n
這種情況可用遞歸表示為split(n, m -
1) + 1,從以上例子中可以看出,就是最大加
數(shù)為6和小于6的劃分之和
用程序表示為if(m == n) return (split(n, m -
1) + 1);
(3) m < n
這是最一般的情況,在劃分的大多數(shù)時(shí)都是這種情況。
從上例可以看出,設(shè)m =
4,那split(6, 4)的值是最大加數(shù)小于4劃分?jǐn)?shù)和整數(shù)2的劃分?jǐn)?shù)的和。
即 split(
6,4) = split(6,3) + split(2,4)
因此,split(n, m)可表示為split(n, m -
1) + split(n - m, m)

?? ??? 按照整數(shù)劃分的思想,將一個(gè)整數(shù)劃分為若干(x<=n) 整數(shù),按由大到小逐級(jí)遞減的順序排列,? 這樣保證了不會(huì)出現(xiàn) 5,1,1 和 1,5,1 這種想同的情況,根據(jù)這樣的思路來(lái)建立一個(gè)遞推關(guān)系。

以前用dfs寫(xiě)的代碼 #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;
} 看來(lái)要向別人學(xué)習(xí)的地方還很多啊。。。。 努力

轉(zhuǎn)載于:https://www.cnblogs.com/FCWORLD/archive/2011/04/13/2015312.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的poj1664(放苹果)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。