利用动态规划,以自底向上的方式解各子问题。
解题思路:此问题可转化为:给定c>0,wi>0,vi>0,1≤i≤n,要求找出一
个n元0-1向量(x1,x2,…,xn),xi∈{0,1},1≤i≤n,使得∑wixi≤c,而且
∑vixi达到最大。因此,0-1背包是一个特
殊的整数规划问题:
max ∑vixi
s.t. ∑wixi≤c
xi∈{0,1},1≤i≤n
代码如下:
-
#include<iostream>
-
#include<iomanip>
-
#include<string>
-
-
usingnamespacestd;
-
-
intMin(intw,intc)
-
{
-
return(w<c?w:c);
-
}
-
-
intMax(intw,intc)
-
{
-
return(w<c?c:w);
-
}
-
-
voidKnapsack(intv[],intw[],intc,intn,int**m)
-
{
-
intrange1=Min(w[n]-1,c);
-
for(intj=0;j<=range1;j++)
-
m[n][j]=0;
-
for(j=w[n];j<=c;j++)
-
m[n][j]=v[n];
-
for(inti=n-1;i>1;i--)
-
{
-
range1=Min(w[i]-1,c);
-
for(j=0;j<=range1;j++)
-
m[i][j]=m[i+1][j];
-
for(intrange2=w[i];range2<=c;range2++)
-
m[i][range2]=Max(m[i+1][range2],m[i+1][range2-w[i]]+v[i]);
-
}
-
m[1][c]=m[2][c];
-
if(c>=w[1])
-
m[1][c]=Max(m[1][c],m[2][c-w[1]]+v[1]);
-
cout<<"最优解:"<<m[1][c]<<endl;
-
}
-
-
voidPrint_Case(int**m,intw[],intc,intn,intx[])
-
{
-
cout<<"得到的一组最优解如下:"<<endl;
-
for(inti=1;i<n;i++)
-
if(m[i][c]==m[i+1][c])
-
x[i]=0;
-
else
-
{
-
x[i]=1;
-
}
-
x[n]=(m[n][c])?1:0;
-
for(inty=1;y<=n;y++)
-
{
-
cout<<setw(5)<<x[y];
-
}
-
cout<<endl;
-
return;
-
}
-
-
voidmain()
-
{
-
intn,c;
-
int**m;
-
cout<<"请输入物品的个数以及重量的上限:";
-
cin>>n>>c;
-
int*v=newint[n+1];
-
cout<<"请输入物品的价值(v[i]:)"<<endl;
-
for(inti=1;i<=n;i++)
-
cin>>v[i];
-
int*w=newint[n+1];
-
cout<<"请输入物品的重量(w[i]):"<<endl;
-
for(intj=1;j<=n;j++)
-
cin>>w[j];
-
int*x=newint[n+1];
-
m=newint*[n+1];
-
for(intp=0;p<n+1;p++)
-
{
-
m[p]=newint[c+1];
-
}
-
Knapsack(v,w,c,n,m);
-
Print_Case(m,w,c,n,x);
- }
分享到:
相关推荐
问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。 b. 回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度...
今天给大家分享0-1背包问题的基本解题思路。小白教程,不涉及到动态规划以及状态转移方程等术语,随着后面的更新,这些都会讲到。 问题描述 给你一个可容纳最大重量为 w 的背包和 N 个物品,每个物品有重量和...
问题描述:给定一个容量为C的背包及n个重量为wi,价值 为p1的物品,要求把物品装入背包,是背包的价值最大, ...解决方法:0/1背包问题有多种解决方法,本实验用动态规 划,回溯,分支界限三种方法进行解题
结合0-1背包问题介绍了回溯法的基本思想和解题步骤,并在VC++6.0环境下验证了回溯法可以有效地解决0-1背包问题。
俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退一步海阔天空——"目标转化思想"的若干应用》 方 奇 -《浅谈必要条件的应用》 符文杰 -《排序网络》 何江舟 -《用...
回溯法的算法框架 具有限界函数的深度优先生成法称为回溯法。 运用回溯法解题通常包含三个步骤 例如,对于有n种可选物品的0-1背包问题,其解空间由长度为n的0-1向量组成
贪心算法解题步骤,经典实例(钱币找零问题、活动选择问题、区间覆盖问题、小船过河问题、Dijkstra最短路径算法(图)、prim最小生成树算法、哈夫曼树和编码、部分背包问题(非0-1背包))。*部分经典实例没有题目...
比赛所给题库的解题代码,一共十四题实现 斐波那契,0-1背包,最短路径; 递归,回文链表,最长子字符串
针对树型状态空间的回溯提出了一个 C语言编程模式,并利用 n皇后、 0-1背包这2个典型问题验证了该模式的正确性。该模式有助于提升对回溯法解题的理解,提高回溯法实 现的可复用性,扩大回溯法的应用范围。
《妙趣横生的算法(C语言实现)》可作为算法入门人员的教程,也...9.4 0-1背包问题 9.5 八皇后问题求解 9.6 简易文件加密/解密系统 第10章 算法设计与数据结构面试题精粹 10.1 常见的算法设计题 10.2 常见的数据结构题
5.5 0/1背包问题 68 6 组合数学相关 69 6.1 The Number of the Same BST 69 6.2 排列生成 71 6.3 逆序 72 6.3.1 归并排序求逆序 72 7 数值分析 72 7.1 二分法 72 7.2 迭代法(x=f(x)) 73 7.3 牛顿迭代 74 7.4 数值...
1.3.2 各类车辆路径规划问题研究(vrp、VRPTW、CVRP) 1.3.3 机器人路径规划问题研究 1.3.4 无人机三维路径规划问题研究 1.3.5 多式联运问题研究 1.3.6 无人机结合车辆路径配送 **1.4 三维装箱求解** **1.5 ...
0、解题方法总结 1、BFS 2、DFS 3、DP 4、二分 5、位运算 6、双指针 7、哈希表 8、回溯 9、字符串 10、数学 11、数组 12、滑动窗口 13、链表 14、字典树 15、堆 16、前缀和 17、背包问题 ...... 陆续更新中