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

发一下牢骚和主题无关:

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

    

    

递归式:

    

    当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
背包问题和选中
---------------------------------

posted @ 2013-05-25 15:51  xinyuyuanm  阅读(441)  评论(0编辑  收藏  举报