0-1背包问题:

  描述:给定n中物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c,问应如何选择装入背包中的物品,使得装入背包中的物品总价值最大?

  0-1背包问题是一个特殊的整数规划问题。

      动态规划——0-1背包问题

  设所给0-1背包问题的子问题;

        动态规划——0-1背包问题

  其最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下:

      动态规划——0-1背包问题

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 }
递归实现代码

相关文章: