递归函数就是直接或间接调用自身的函数。
递归式:
当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 f(t-1,c); }else{ y[i]=1; return price[i]+f(t-1,c-weight[i]); } } } } } int main(){ int c,t,maxval,i; printf("请输入物品的的个数:"); scanf("%d",&t); for(i=0;i<t;i++){ y[i]=0; 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; }