0-1背包问题:
描述:给定n中物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c,问应如何选择装入背包中的物品,使得装入背包中的物品总价值最大?
0-1背包问题是一个特殊的整数规划问题。
设所给0-1背包问题的子问题;
其最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下:
NO1:递归实现
1 /* 2 *Description 递归实现 3 *设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。 4 *问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。 5 *如果有满足条件的选择,则此背包有解,否则此背包问题无解。 6 */ 7 # include<stdio.h> 8 # include<string.h> 9 10 int date[1005]; 11 12 int f(int w,int s) 13 { 14 if(w==0) return 1;//正好 15 if(w<0||w>0 &&s==0) return 0; 16 if(f(w-date[s],s-1)) return 1;//退出来再选下一个 17 return f(w,s-1);//选择下一个 18 } 19 20 int main() 21 { 22 int i,Weight,n; 23 while(scanf("%d %d",&Weight,&n)!=EOF) 24 { 25 memset(date,0,sizeof(date)); 26 for(i=1;i<=n;i++) 27 scanf("%d",&date[i]); 28 if(f(Weight,n)) 29 printf("YES\n"); 30 else 31 printf("NO\n"); 32 } 33 return 0; 34 }