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

题目要求:

输入背包的容量v和物品的数量n;接下来n 行每行输入两个数字,第一个是物品质量,第二个是物品价值;

输出背包容纳物品的最大价值。

下面直接贴代码:

回溯法

 1 #include<iostream>//之前必须知道背包容量和n个物品
 2 #include<algorithm>
 3 using namespace std;
 4 class Property
 5 {
 6     public:
 7     int weight,profit;
 8     double average;
 9     friend bool operator<(Property a,Property b)
10     {
11         return a.average>b.average;
12     }
13 };
14 class Pack
15 {
16     public:
17         Pack(int Q,int n)//构造函数,初始化
18         {
19             capcity=Q;
20             number=n;
21             property=new Property[n+1];
22             bestp=cw=cp=0;
23         }
24         ~Pack()
25         {
26             delete []property;
27         }
28         void inputproperty()
29         {
30             for(int i=0;i<number;i++)
31             {
32                 cin>>property[i].weight>>property[i].profit;
33                 property[i].average=1.0*property[i].profit/property[i].weight;
34             }
35             sort(property,property+number);
36         }
37         int command()
38         {
39             int totalweight=0;
40             int totalvalue=0;
41             for(int i=0;i<number;i++)
42             {
43             totalweight+=property[i].weight;
44             totalvalue+=property[i].profit;
45             }
46             if(totalweight<capcity)return totalvalue;
47             backtrack(0);
48             return bestp;
49         }
50         bool bound(int i)
51         {
52             int currentp=cp;
53             int currentw=capcity-cw;
54             while(currentw>=property[i].weight&&i<number)
55             {
56                 currentw-=property[i].weight;
57                 currentp+=property[i].profit;
58                 i++;
59             }
60             if(i<number)
61             currentp+=1.0*property[i].profit*currentw/property[i].weight;
62             return currentp>bestp;
63         }
64         void backtrack(int i)
65         {
66             if(i>number-1)
67             {
68                 if(bestp<cp)
69                 bestp=cp;
70                 return;
71             }
72             if(cw+property[i].weight<=capcity)//此处必须用<=比较符号,不然会错
73             {
74                 cw+=property[i].weight;
75                 cp+=property[i].profit;
76                 backtrack(i+1);
77                 cw-=property[i].weight;
78                 cp-=property[i].profit;
79             }
80             if(bound(i+1));
81             backtrack(i+1);
82         }
83     private:
84     int capcity,number;
85     Property *property;
86     int cw,cp,bestp;
87 };
88 int main()
89 {
90     int n,m;
91     while(cin>>n>>m)
92     {
93         Pack object(n,m);
94         object.inputproperty();
95         cout<<object.command()<<endl;
96     }
97     return 0;
98 }

输入:

20 5
4 7
5 8
2 10
5 10
8 16

输出:
44

动态规划法

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int main()
 5 {
 6     int Capcity,weight;
 7     int *w,*p;
 8     int profit[200][200];
 9     while(cin>>Capcity>>weight)
10     {
11         memset(profit,0,sizeof(profit));
12         w=new int[weight+1];
13         p=new int[weight+1];
14         for(int i=1;i<=weight;i++)
15         cin>>w[i]>>p[i];//输入重量和价值
16         for(int i=1;i<=weight;i++)
17         {
18             for(int j=1;j<=Capcity;j++)
19             {
20                 if(w[i]>j)profit[i][j]=profit[i-1][j];
21                 else if(profit[i-1][j]<profit[i-1][j-w[i]]+p[i])
22                 profit[i][j]=profit[i-1][j-w[i]]+p[i];
23                 else profit[i][j]=profit[i-1][j];
24             }
25         }
26         for(int i=1;i<=weight;i++)
27         {
28         for(int j=1;j<=Capcity;j++)
29         {
30             cout<<profit[i][j]<<" ";
31         }
32         cout<<endl;
33         }
34     }
35     return 0;
36 }

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

时间: 2024-10-05 04:39:05

01背包问题回溯法和动态规划的相关文章

【动态规划】01背包问题_两种解法

问题描述 0-1背包问题:给定\(n\)种物品和一背包.物品i的重量是\(w_i\),其价值为\(v_i\),背包的容量为\(C\).问:应该如何选择装入背包的物品,使得装人背包中物品的总价值最大? 在选择装人背包的物品时,对每种物品\(i\)只有两种选择,即装人背包或不装入背包.不能将物品\(i\)装入背包多次,也不能只装入部分的物品\(i\).因此,该问题称为0-1背包问题. 此问题的形式化描述是,给定\(C>0\),\(w_i>0\),\(v_i>0\),\(1≤i≤n\),要求找

回溯法-01背包问题之一:递归模式

一.回溯法 回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中按照深度优先的策略,从根节点出发搜索解空间树.算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解.如果肯定不包含,则跳过对以该节点为根的子树的系统搜索,逐层向其原先节点回溯.否则,进入该子树,继续按深度优先的策略进行搜索. 运用回溯法解题通常包含以下三个步骤: · 针对所给问题,定义问题的解空间: · 确定易于搜索的解空间结构: · 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函

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

普通背包问题可以用贪心来解决,而0-1背包问题只能靠动态规划来做,而且在我们平时的做题中经常会遇到0-1背包问题的变形,所以有必要牢牢掌握0-1背包问题的思想和解题思路. 根据下面的图更可以找到应该选那些背包 下面是我根据此思路模拟的代码 1 #include<bits/stdc++.h> 2 using namespace std; 3 int array3[100];//价值 4 int array1[100];//物品重量 5 int capacity;//容量 6 int n;//物品

【算法导论】0-1背包问题

一.0-1背包问题描述: 已知:小偷在店里偷东西,小偷只带了一个最大承重为W的背包,商店里有N件商品,第i件商品的重量是weight[i],价钱是value[i]. 限制:每种商品只有一件,可以选择拿或者不拿,不能分割,不能只拿一件商品的一部分(所以叫做0-1,0即不拿,1则整个拿走,且一种商品有且只有一件可供拿走) 问题:在不超过背包最大承重的情况下,最多能拿走多少钱的商品. 算导上与0-1背包问题对应的是分数背包问题,分数背包问题中的物品是可以取一部分的,就是说可以拆分的,不像0-1背包中,

4、0-1背包问题

背包问题 对于0-1背包问题,由于我们对一个商品只有两种选择:要或者不要.于是我们的背包问题不是一个贪心算法问题,很简单 如果选用贪心算法,我们肯定是决定选用"商品单位重量价值最高",如下面的例子则相反了 如上图中有3种商品的价值以及重量,背包容量为50. 那么如果选用贪心算法,则商品1的单位重量价值最高为60/10=6. 而商品2和商品3的分别为100/20和120/30为5和4.肯定不行,但是如果选用商品1,则2和3只能选一个 但是如果选用商品2和3,则: 于是,我们可以看到,选2

0-1背包问题与分数背包问题

0-1背包问题与分数背包问题 问题描述 问题分析之分数背包 代码设计之分数背包问题 问题分析之0-1背包问题 代码设计之0-1背包问题 动态规划算法之间的差别 0-1背包问题与分数背包问题 我们在文章<贪心算法原理>:http://blog.csdn.net/ii1245712564/article/details/45369491中提到过动态规划和贪心算法的区别.以及两个经典的例子:0-1背包问题和分数背包问题,我么知道0-1背包问题是不能够使用贪心算法求解的,而贪心算法则是分数背包问题的不

01背包问题的动态规划算法

01背包问题我最初学会的解法是回溯法,第一反应并不是用动态规划算法去解答.原因是学习动态规划算法的时候,矩阵连乘.最长公共子串等问题很容易将问题离散化成规模不同的子问题,比较好理解,而对于01背包问题则不容易想到将背包容量离散化抽象出子问题,从情感上先入为主也误以为动态规划算法不是解决01背包问题的好方法,实际上并不是这样的.另外,动态规划算法不对子问题进行重复计算,但是要自底向上将所有子问题都计算一遍,直到计算出最终问题的结果也就是我们要的答案,有点像爬山的感觉. 问题描述:给定n种物品和一背

01背包问题(回溯法)python实现

接上一篇,同样的01背包问题,上一篇采用动态规划的方法,现在用回溯法解决.回溯法采用深度优先策略搜索问题的解,不多说,代码如下: bestV=0 curW=0 curV=0 bestx=None def backtrack(i): global bestV,curW,curV,x,bestx if i>=n: if bestV<curV: bestV=curV bestx=x[:] else: if curW+w[i]<=c: x[i]=True curW+=w[i] curV+=v[i

1008-----算法笔记----------0-1背包问题(动态规划求解)

1.问题描述 给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? 2.问题分析 上述问题可以抽象为一个整数规划问题,即求满足 (a)Σwixi ≤ C:(b)xi ∈(0,1),  1≤i≤n:条件下,∑vixi最大时的一个物品xi序列.分析问题可以发现,该问题具有最优子结构性质,那么就可以尝试用动态规划方法求解,而动态规划求解的关键就是列出问题的递归关系表达式. 设m(i,j)为背包容量为j,可选物品为i,