您的位置:首页 > 其它

背包问题选中递归求解0 1背包问题

2013-05-25 15:51 295 查看
发一下牢骚和主题无关:

递归函数就是直接或直接调用自身的函数。

递归式:

当wn>C时, f(n,C)=f(n-1,C);

当wn<=C时,f(n,C) = max(f(n-1,C), vn+f(n-1, C-wn) );

初始条件为:f(i, 0) = 0; f(0,i) = 0; f(0,0) = 0;

每日一道理

“一年之计在于春”,十几岁的年纪,正是人生的春天,别辜负了岁月老人的厚爱与恩赐。行动起来,播种梦想吧!

#include <stdio.h>

#define MAX 100

int weight[MAX];
int price[MAX];
int y[MAX]={0};

//停止递归重要方法
int f(int t,int c){
if((t==0)||c==0){  //当物品个数为0或背包容积为0事退出
return 0;
}else{
for(int i=t-1;i>=0;i--){
if(weight[i]>c){  //当物品重量大于背包容积
y[i]=0;  //此时物品不被选中
return f(t-1,c);  //在剩余物品中选取
}else{
int	temp1=f(t-1,c); //当第t个物品没被选中时
int	temp2=price[i]+f(t-1,c-weight[i]);//被选中时
if(temp1>temp2){
y[i]=0;
return temp1;
}else{
y[i]=1;
return temp2;
}
}
}
}
}
int main(){
int c,t,maxval,i;
printf("请输入物品的的个数:");
scanf("%d",&t);
for(i=0;i<t;i++){
printf("\n请输入第%d个物品的重量和代价",i+1);
scanf("%d%d",&weight[i],&price[i]);
}
printf("\n请输入背包的容积");
scanf("%d",&c);
maxval=f(t,c);
printf("j结果为:1代表选中");
for(i=0;i<t;i++){
//if(y[i]==1)
printf("\n%d %d %d\n",y[i],weight[i],price[i]);
}
printf("总代价为:%d",maxval);
return 0;
}




可见代价和是正确的,但是对应下标不正确,希望大家有谁可以帮忙指出犯错哪里??

文章结束给大家分享下程序员的一些笑话语录: 问路

有一个驾驶热气球的人发现他迷路了。他降低了飞行的高度,并认出了地面 上的一个人。他继续下降高度并对着那个人大叫,“打扰一下,你能告诉我我 在哪吗?”

下面那个人说:“是的。你在热气球里啊,盘旋在 30 英尺的空中”。

热气球上的人说:“你一定是在 IT 部门做技术工作”。

“没错”,地面上的人说到,“你是怎么知道的?”

“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。

地面上的人说,“你一定是管理层的人”。

“没错”,热气球上的人说,“可是你是怎么知道的?”

“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。

---------------------------------
原创文章 By
背包问题和选中
---------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: