您的位置:

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); //显示最高价值方案

}