❶ 猴子上樓梯的c語言詳細原代碼及解析
20分……
只能給你思路了
用數組a[i]記錄猴子上到第i個階梯時最少代價,b[i]為所輸入的階梯上的正整數數據
用兩層循環,
第一層循環i是從1到n,對每層階梯進行掃描
第二層循環j是從1到k,如果a[i+j]<a[i]+b[i+j]即將a[i+j]更新為a[i]+b[i+j]
a[i]+b[i+j]的意思是在第i層階梯的最少代價加上第i+j層的那個數據,
如果小於在第i+j層的暫時最小代價(因為最小值還沒確定),
那麼就更新第i+j層的代價,使它變得更小
這樣一步步遞推,就能得到a[n]的最小代價
❷ C語言題目:一個猴子在一座不超過30級的山上跳躍,上山一步可跳1級或2級或3級,求上山有多少種爬法急急
這樣的一個題你可以參考一下,希望對你有幫助。。。。。。。
一隻頑猴在一座有50級台階的小山上爬山跳躍。上山時需從山腳至山頂往上跳50級台階,一步可跳2級,或跳3級,或跳4級,求上山有多少種不同的跳法?下山時從山頂至山腳往下跳50級台階,一步可跳1級,或跳2級,或跳3級,求下山有多少種不同的跳法?
程序怎樣寫?
#include <stdio.h>
//狀態存儲數組
double way[52];
int main ()
{
//初始化
way[1] = 0;
way[2] = 1;
way[3] = 1;
way[4] = 2;
for (int i=5; i<=50; i++)
{
way[i] = way[i-2]+way[i-3]+way[i-4];
}
printf("上山的跳法:%.0lf\n", way[50]);
//初始化
way[0] = 0;
way[1] = 1;
way[2] = 2;
way[3] = 4;
for (int i=4; i<=50; i++)
{
way[i] = way[i-1]+way[i-2]+way[i-3];
}
printf("下山的跳法:%.0lf\n", way[50]);
return 0;
}
❸ c語言程序設計
#include<stdio.h>
intmain()
{
inti=0,j=0;
intslnum=0;
for(i=0;i<=30;i++)
for(j=0;j<=10;j++){
if((i+3*j)==30){
slnum++;
printf("%d,%d ",i,j);
}
}
printf("thenumofsolutionis%d ",slnum);
return0;
}
其實就是x+3y = 30有多少解的問題
❹ 急求!C語言遞推問題
倒著想,我先舉個例子,比如N=10 x=3 y=4
那麼 我要到在第10階,一種辦法是從第7階走x=3步到10,另一種從第6階走y=4步到10
這個問題化為走到7階和6階要如何走
再看7階。一種辦法是從第4階走x步到7階,另一種從第3階走y=4步到7
再看6階。一種辦法是從第3階走x步到6階,另一種從第2階走y=4步到6.但考慮到處若從2階走4到6的話,2階是不可能到達的。因為只能走3或4階,所以這里刪掉這種情況
就剩下走到第4階和第3階的走法了
顯然它們各自只有一種走法
最後就是
3+3+4
3+4+3
4+3+3
共3種
這種思想就是倒著想,向前推進。再逆轉過來。有點類似動態規劃
化為一般的思想
走到N階有幾種走法的問題可以轉化為走到N-X與走到N-Y階之和(X!=Y)
而同理N-X要看N-2X與N-X-Y的走法之和
N-Y要看N-X-Y與N-2Y之和
依次下去。最終結束的條件就是N-aX或N-bY或N-cX-dY中任何一個小於給定的X或Y說明此種走法不通。那麼去掉這種走法且結束。
若開始的時候上述條件就成立則為sorry
❺ C語言:所有猴子按1~M 編號圍坐一圈,從第p 號開始按順序1~N 報數,凡報到N 的猴子退出到圈外
http://www.cnblogs.com/EricYang/archive/2009/09/04/1560478.html
這是約瑟夫環的問題,上面有鏈接。
❻ 一個c語言題目,選猴子,從m個猴子中每隔n-1個猴子踢出去一個,不斷順時針循環
六財福珠寶
六財福珠寶
❼ c語言編程解決小猴爬山
上山下山應該是一樣的,都是讓電腦一個值一個值去判斷。我的想法是讓電腦先判斷出所有可能的組合,比如2+3+5和3+2+5是一個概念,然後建立一個排列組合的函數,對組合進一步處理。上山為例:
#include<stdio.h>
intjc(inta)//階乘
{
inti,j=1;
for(i=a;i>0;i--)
{
j=j*i;
}
returnj;
}
intmain(intargc,char*argv[])
{
intn;//方法數
constintt=50;//台階數
inti,j,k;
for(i=0;i<=25;i++)//2*25=50
for(j=0;j<17;j++)//3*16=48
for(k=0;k<13;k++)//4*12=28
{
if(2*i+3*j+4*k==t)//兩步、三步或四步
{
n=n+jc(i+j+k)/(jc(i)*jc(k)*jc(j));
}
}
printf("上山總數為:%d種 ",n);
return0;
}
這個程序計算出來上山有3731種