c語言背包遞歸,c語言遞歸漢羅塔

本文目錄一覽:

C語言背包問題遞歸演算法

你學過數據結構了嗎?如果學過,那就比較好理解,該演算法的思路和求二叉樹的高度的演算法的思路是十分類似的。把取這i個物體看成i個階段,則該二叉樹有i+1層。其中空背包時為根結點,左孩子則為放棄了第1個物品後的背包,右孩子為選取了第1個物品後的背包。今後在對第i個物品進行選擇時,向左表示放棄,向右表示選取。則遞歸演算法可如下:

int fun(int s, int i, int n) //s傳入的是背包容量, i是進行第i個物品的選取,n為剩餘物品的件數

{

if(s == 0) return 有解;

else if(剩餘的每件物品都裝不進|| n == 0) return 無解;

L = fun(s, i + 1, n – 1); //放棄第i個物品,則下一步的背包容量仍為s,然後看其是否有解,(遞歸調用進入左子樹)

R = fun(s – wi, i + 1, n – 1); //選取第i個物品,則下一步的背包容量為s-wi,然後看其是否有解,(遞歸調用進入右子樹)

return (l, r); //綜合考慮左右兩邊,看哪邊是正解或都無解。其實應該返回 return (L||R);

}

C語言 簡單的背包問題 遞歸 求大神幫忙看看 十分感謝啊

我改變了在VC + +6.0,你看它。主要的問題是要找到一個素數演算法。 = N/10; B = N%10 = B + A = N/10改變; B = N%10,C = 10 * B + A ==;

BR / ##包括「stdafx.h中」

「包括」math.h的「

無效的蘇薯(N)

{INT I,K1,K2,A,乙,C;

K1 =開方(N);

(I = 2; N + +)

= 0); /如果(我 = K1 +1)

{= N/10,B = N%10,C = 10 * B + A;

K2 = SQRT(C); BR /(= 2 C,I + +)

(C == 0);

( = K +1)

printf的(4D,N);

}

a

}

無效的主要()

{N;

(= 10,N 100,N +)

蘇薯(N);

getchar函數();

}

C語言 背包問題 遞歸演算法

提問者的這程序中用了遞歸演算法,不過邏輯上有個小bug,就是在判斷到n==0時,如果還有容量,那麼返回的應該是第一個物品的重量而不是0。你可以改變容量C或物品參數來檢驗演算法的邏輯正確性。

關於輸出選擇的物品,我加了一個數組,用來標記選擇的物品。因為做完所有遞歸後只有最外層的標記是有效的,所以最後用了一個for循環來完成各層的標記。下面是改動後的程序:

    int a[5]={0};

int MaxW(int n, int C, int *Volunme, int *Weight)

{

int W=0,W1=0,W2=0;

if (n == 0)

{

if(C = Volunme[0])

{

a[0]=1;

return W=1;

}

else

return 0;

}

else if(C = Volunme[n])//背包剩餘空間可以放下物品n

{

W1 = MaxW(n-1, C-Volunme[n],Volunme,Weight) + Weight[n]; //放入n所能得到的重量

W2 = MaxW(n-1,C,Volunme,Weight); //不放n所能得到的重量

W=(W1W2?W1:W2);

a[n]=(W1W2?1:0);

}

else//背包空間放不下n,返回判斷放n-1的情況

{

return MaxW(n-1,C,Volunme,Weight);

}

return W;

}

int main(void)

{

int n=5;int C=7;

int Volunme[] = {1,2,3,4,5};

int Weight[] = {1,2,5,7,8};

printf(“最大重量為%d\n”,MaxW(n-1,C,Volunme,Weight));

for(int i=n-2;i=0;i–)

{

a[i]=0;

if(a[i+1]==1)

{

C-=Volunme[i+1];

Weight[i+1]=0;

}

MaxW(i,C,Volunme,Weight);

}

printf(“選擇的物品號是:”);

for(int i=0;i5;i++)

{

if(a[i]==1)

printf(“#%d  “,i+1);

}

printf(“\n”);

return 0;

}

C語言,背包問題,用遞歸演算法,下面這個怎麼編程,謝謝!

#include stdio.h

#define V 500 //最多體積

#define W 100 //最多重量

#define N 5 //物品種類

typedef struct data{

int v; //體積

int w; //重量

int n; //數量

int x; //價值

}DATA;

DATA s[N]={

{30,3,10,4},

{50,8,10,5},

{10,2,10,2},

{23,5,8,3},

{130,20,5,11}

};

//返回a方案的價值

int xfangan(int *a,int n){

int sum=0,i;

for(i=0;in;i++)

sum+=s[i].x*a[i];

return sum;

}

//返回a方案的重量

int wfangan(int *a,int n){

int sum=0,i;

for(i=0;in;i++)

sum+=s[i].w*a[i];

return sum;

}

//返回a方案的體積

int vfangan(int *a,int n){

int sum=0,i;

for(i=0;in;i++)

sum+=s[i].v*a[i];

return sum;

}

//顯示max方案的信息

void showmax(int *max){

int i;

for(i=0;iN;i++) printf(“%d “,max[i]);

printf(“重量=%d 體積=%d 價值=%d\n”,wfangan(max,N),vfangan(max,N),xfangan(max,N));

}

//選擇方案

void dofangan(int *max,int *fa,int n){

int i;

if (n=N) return;

for(fa[n]=0;fa[n]=s[n].n;fa[n]++){

if (vfangan(fa,n+1)V) break; //超大

if (wfangan(fa,n+1)W) break; //超重

if (xfangan(fa,n+1)xfangan(max,N)){ //更有價值

for(i=0;i=n;i++) max[i]=fa[i];

for(i=n+1;iN;i++) max[i]=0;

}

dofangan(max,fa,n+1);

}

}

int main(){

int max[N],fa[N],i;

for(i=0;iN;i++) max[i]=0; //最高價值方案初值

dofangan(max,fa,0); //遞歸查找價值最高方案

showmax(max); //顯示最高價值方案

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159816.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:16
下一篇 2024-11-20 00:16

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • 台階走法遞歸

    台階走法遞歸是一個經典的遞歸問題,在計算機演算法中有著廣泛的應用。本篇文章將從遞歸的思想出發,詳細分析如何解決這個問題。 一、遞歸基礎知識 遞歸是指一個函數直接或間接地調用自身。遞歸…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論