設(shè)二元函數(shù) f( n , p )為滿足以下條件的分劃數(shù):

站在用戶的角度思考問題,與客戶深入溝通,找到江山網(wǎng)站設(shè)計與江山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋江山地區(qū)。
1. p = n1 = n2 = ... = nk
2. n1 + n2 + ... + nk = n
按以下方法可以求出f( n , p )的遞推關(guān)系式:
當(dāng)n1 = p 時,
應(yīng)有 n2 + ... + nk = n - p ,
且 p = n2 = ... = nk
有 f( n-p , p )種分劃;
當(dāng)n1 = p + 1 時,
應(yīng)有 n2 + ... + nk = n - p - 1 ,
且 p+1 = n2 = ... = nk
有 f( n-p-1 , p+1 )種分劃;
同理
n1 = p + 2 時有 f( n-p-2 , p+2 )種分劃;
…
…
n1 = p + i 時有 f( n-p-i , p+i )種分劃;
…
…
最后,n1 = n ,有 1 種分劃。
所以 f( n , p ) = f(n-p , p) + f(n-p-1 , p+1) + ..
.. + f(n-p-i , p+i) + ... + f(1 , n-1) + 1
另外,在這個函數(shù)中,當(dāng) 2*pn 時,也就是 n1 大于 n/2 時,
顯然可以看出 f=0,因為這樣的分劃不存在。
所以上式可以化簡成
f( n , p ) = f(n-p , p) + f(n-p-1 , p+1) + ..
.. + f(n-p-i , p+i) + ... + f( [n/2] , n-[n/2]) + 1
所以你的題目就是求f(n,1)的值
f(n,1)=f(n-1,1) + f(n-2,2) + .. + f([n/2],n-[n/2]) +1
(把[ ]當(dāng)作上取整)
用遞歸實(shí)現(xiàn)上面說的那個函數(shù),然后把你指定的n和1作參數(shù)傳遞給它就OK了。
哦對了,遞歸出口是f(1,1)=1,這個由題意和函數(shù)的定義很容易得到。
ps,這個函數(shù)似乎可能應(yīng)該好象可以轉(zhuǎn)化成非遞歸型的,不過我懶得繼續(xù)再想了.....對小于80的數(shù)我的機(jī)子都用不到1秒..
另外,你的題目里是否應(yīng)該n=6時輸出11 ?
PASCAL我不會,反正這數(shù)學(xué)模型沒問題,轉(zhuǎn)化成語言應(yīng)該是你自己的事吧.
import?java.util.Scanner;
public?class?numberDiv?{
//?private?static?final?huafen?numberrDiv?=?null;
//?static?int?d[]=new?int[32];
public?static?void?main(String[]?args)?{
System.out.println("請輸入的整數(shù):");
Scanner?sc?=?new?Scanner(System.in);
int?number?=?sc.nextInt();
int?num?=?numberDiv.Division(number,?number,?"");
System.out.println("num="?+?num);
}
public?static?int?Division(int?m,?int?n,?String?str)?{
if?((m?=?0)?||?(n?=?0))
return?0;
if?((m?==?1)?||?(n?==?1))?{
System.out.print(str);
for?(int?i?=?1;?i??m;?i++)?{
System.out.print("1+");
}
System.out.println("1");
return?1;
}
if?(n?==?m)?{
System.out.println(str?+?m);
return?1?+?numberDiv.Division(m,?n?-?1,?str);
}
if?(m??n)?{
int?n1?=?numberDiv.Division(m?-?n,?n,?str?+?n?+?"+");
int?n2?=?numberDiv.Division(m,?n?-?1,?str);
return?n1?+?n2;
}
return?numberDiv.Division(m,?m,?str);
}
}
Division方法返回分解的個數(shù),所以numberDiv類不需要再定義成員變量static int num=0;。
Division方法中if ((m == 1) || (n == 1))成立時,本次是一個分解,并且不需要再遞歸分解,所以返回1。
Division方法中if (n == m)成立時,本次是一個分解,且需要遞歸分解,所以返回1+遞歸分解個數(shù)。
Division方法中if (m n)成立時,返回兩個遞歸分解的個數(shù)之和。
Division方法中最后代碼即為m? n,直接返回遞歸分解的個數(shù)。
#includestdio.h
int?stack[100];
int?top;
int?total,n;
void?dfs(int?index)
{
int?i;
if(total==n)
{
printf("%d=",n);
for(i=top-1;i0;i--)
printf("%d+",stack[i]);
printf("%d\n",stack[0]);
}
if(totaln?)
return?;
for(i=n-1;i=index;i--)
{
total+=i;
stack[top++]=i;
dfs(i);
total-=i;
stack[--top];
}
}
void?main()
{
while(scanf("%d",n)!=EOF)
{
top=0;
total=0;
dfs(1);
}
}
這個可以用遞歸來實(shí)現(xiàn)。。。。。代碼如下。。。還是想了很久弄出來的。。。。已經(jīng)測試了的。。。希望能幫到你。。。
import
java.util.Scanner;
public
class
Test
{
public
static
void
huafenD(int
oldData,int
j,
int
n,StringBuffer
result){
StringBuffer
r
=
new
StringBuffer(result);
for(
int
i
=
j;i=n;i++){
if(i==ni!=oldData)
{
result.append(i);
System.out.println(result.toString());
result
=
new
StringBuffer(r);
}
else
if(i!=oldData){
result.append(i);
result.append("+");
huafenD(oldData,i,n-i,result);
result
=
new
StringBuffer(r);
}
}
}
public
static
void
main(String
args[])
{
Scanner
in
=
new
Scanner(System.in);
System.out.println("請輸入一個整數(shù)(1-10)");
int
data
=
in.nextInt();
while(data1||data10){
System.out.println("您的輸入
不符合要求,請重新輸入");
data
=
in.nextInt();
}
if(data==1)System.out.println("無需劃分");
else
{
StringBuffer
sb
=
new
StringBuffer();
huafenD(data,1,data,sb);
}
}
}
運(yùn)行結(jié)果示例:
請輸入一個整數(shù)(1-10)
6
1+1+1+1+1+1
1+1+1+1+2
1+1+1+3
1+1+2+2
1+1+4
1+2+3
1+5
2+2+2
2+4
3+3
當(dāng)前文章:整數(shù)劃分問題代碼java 整數(shù)劃分問題算法
鏈接URL:http://chinadenli.net/article20/ddgcsco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、移動網(wǎng)站建設(shè)、網(wǎng)站制作、搜索引擎優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)