`

01背包问题

 
阅读更多
问题描述:

给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大??

在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。 

 

问题分析:令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:

(1)   V(i,0)=V(0,j)=0 

(2)   V(i,j)=V(i-1,j)  j<wi  

       V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } j>wi

(1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;第(2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。

 

 

  1 #include<stdio.h>

复制代码
 2 
 3 int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值
 4 int max(int a,int b)
 5 {
 6    if(a>=b)
 7        return a;
 8    else return b;
 9 }
10 
11 int KnapSack(int n,int w[],int v[],int x[],int C)
12 {
13     int i,j;
14     for(i=0;i<=n;i++)
15         V[i][0]=0;
16     for(j=0;j<=C;j++)
17         V[0][j]=0;
18     for(i=0;i<=n-1;i++)
19         for(j=0;j<=C;j++)
20             if(j<w[i])
21                 V[i][j]=V[i-1][j];
22             else
23                 V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
24             j=C;
25             for(i=n-1;i>=0;i--)
26             {
27                 if(V[i][j]>V[i-1][j])
28                 {
29                 x[i]=1;
30                 j=j-w[i];
31                 }
32             else
33                 x[i]=0;
34             }
35             printf("选中的物品是:\n");
36             for(i=0;i<n;i++)
37                 printf("%d ",x[i]);
38             printf("\n");
39         return V[n-1][C];
40         
41 }
42 
43 void main()
44 {
45     int s;//获得的最大价值
46     int w[15];//物品的重量
47     int v[15];//物品的价值
48     int x[15];//物品的选取状态
49     int n,i;
50     int C;//背包最大容量
51     n=5;
52     printf("请输入背包的最大容量:\n");
53     scanf("%d",&C);
54     
55     printf("输入物品数:\n");
56     scanf("%d",&n);
57     printf("请分别输入物品的重量:\n");
58     for(i=0;i<n;i++)
59         scanf("%d",&w[i]);
60 
61     printf("请分别输入物品的价值:\n");
62     for(i=0;i<n;i++)
63         scanf("%d",&v[i]);
64 
65     s=KnapSack(n,w,v,x,C);
66 
67     printf("最大物品价值为:\n");
68     printf("%d\n",s);
69    
70     
71 }
分享到:
评论

相关推荐

    01背包问题的C语言代码

    01背包问题是一种经典的计算机科学优化问题,常用于求解有限资源下的最佳分配策略。它在实际生活中的应用广泛,比如商品装箱、任务调度、投资组合优化等场景。在这个问题中,我们有一系列物品,每个物品都有一个价值...

    用回溯法解决01背包问题C语言实现

    01背包问题是一种在计算机科学和运筹学中常见的优化问题,主要涉及到组合优化和动态规划。在这个问题中,我们有n个物品,每个物品都有一个重量w[i]和一个价值v[i],以及一个容量为W的背包。目标是选择物品放入背包,...

    01背包问题(动态规划法).pdf

    "01背包问题(动态规划法)" 本文将详细介绍动态规划法解决01背包问题的算法设计思想、算法改进思想、存储结构、算法实现等内容。动态规划是一种非常重要的算法方法,广泛应用于经济管理、生产调度、工程技术和最优...

    分治法求01背包问题c语言

    01背包问题是一种经典的组合优化问题,常出现在计算机科学、运筹学以及算法设计与分析中。它描述了这样一个场景:我们有一组物品,每件物品都有一定的重量和价值,现在有一个容量有限的背包,我们需要决定选取哪些...

    回溯法和动态规划法解01背包问题

    01背包问题是一种经典的组合优化问题,经常在计算机科学,特别是在算法设计和分析中出现。这个问题的基本设定是:你有一组物品,每种物品都有一个重量和一个价值,以及一个固定容量的背包。目标是在不超过背包容量的...

    01背包问题_01背包问题_

    01背包问题是一种经典的组合优化问题,广泛应用于资源分配、任务调度等领域。在这个问题中,我们有一个容量为W的背包,以及n件物品,每件物品都有一个重量w[i]和一个价值v[i]。目标是选取不超过背包容量的物品,使得...

    利用动态规划解决01背包问题

    利用动态规划解决01背包问题 动态规划是一种非常重要的算法方法,它可以用来解决许多复杂的问题,例如经济管理、生产调度、工程技术和最优控制等方面的问题。01背包问题是动态规划的经典模型之一,它可以用于解决...

    Python基于回溯法解决01背包问题实例

    在计算机科学中,优化问题经常需要求解一个有限的解空间,01背包问题就是这类问题的一个典型例子。01背包问题涉及到在一个有限的容量限制下,如何选择物品以最大化价值。这个问题可以通过多种方法解决,其中回溯法是...

    01背包问题 回溯法

    01背包问题是一种经典的组合优化问题,常在计算机科学、运筹学以及算法设计与分析中出现。在这个问题中,我们有一组物品,每种物品都有一个重量和一个价值,我们的目标是在不超过背包总容量的前提下,选取物品以最大...

    贪婪法解决01背包问题

    贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题

    01背包问题回溯法解决子集树

    01背包问题是一种经典的组合优化问题,经常出现在计算机科学、运筹学以及算法设计与分析中。在这个问题中,我们有n个物品,每个物品都有一个重量w[i]和一个价值v[i],以及一个容量为W的背包。目标是选择物品的子集,...

    01背包问题的贪心算法.pdf

    ### 01背包问题的贪心算法 #### 一、问题背景及定义 01背包问题是一种经典的组合优化问题,在计算机科学与运筹学领域有着广泛的应用。该问题描述如下:给定一组物品,每个物品都有一个重量\( w_i \)和一个价值\( v...

    分支限界算法 01背包问题

    在解决01背包问题时,分支限界法是一种非常有效的方法。01背包问题是一个经典的组合优化问题,目标是确定如何在容量有限的背包中放入物品以最大化总价值,其中每种物品都有一个重量和一个价值,且物品只能被完全取走...

    C++分支限界法(BFS求解01背包问题)

    本主题将深入探讨如何使用C++编程语言,结合分支限界法(通常与广度优先搜索BFS相结合)来解决01背包问题。 01背包问题是一个经典的组合优化问题,其核心是给定一组物品,每件物品有重量和价值,目标是在不超过背包...

    93、1267:【例9.11】01背包问题(2020.03.17)a.pdf

    在给定文件中,我们可以提取到关于01背包问题的知识点。01背包问题是一个经典的动态规划问题,在计算机科学和运筹学中有广泛应用,尤其在算法竞赛如NOIP(全国青少年信息学奥林匹克竞赛)和少儿编程中十分常见。问题...

    01背包问题穷举法

    其中,“01背包问题”是最基础的一种形式。 **01背包问题定义** 01背包问题得名于每个物品只能被完全放入或完全排除,即每种物品的数量是“0”或“1”,不能分割。具体来说,我们有一组物品,每种物品都有一个重量...

    C++编写的01背包问题

    01背包问题是一种经典的计算机科学优化问题,常用于学习和研究动态规划算法。在这个问题中,我们有一个容量有限的背包,以及一系列物品,每个物品都有一个重量和一个价值。目标是选择一部分物品装入背包,使得背包总...

    非01背包问题

    非01背包问题,也称为部分背包问题或有界背包问题,是背包问题的一个变种。在经典的01背包问题中,我们面对的是一个有限的背包,每种物品都有一个重量和价值,目标是在不超过背包容量的前提下,选择物品以最大化总...

Global site tag (gtag.js) - Google Analytics