发一下牢骚和主题无关:
递归函数就是直接或直接调用自身的函数。
递归式:
当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
背包问题和选中
---------------------------------