本文目录一览:
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); //显示最高价值方案
}