0-1背包问题

文档需要包含如下内容:问题描述(5分),输入(5分),输出(5分),算法设计(25分),举例(30分),代码(30分)等内容。根据提交文档进行评分,每个问题100分。
(1)使用任意算法解决如下问题
问题:有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 w[i],价值是 p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
问题描述:设计一个用回测法搜索子集空间树的函数,参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。
01背包问题描述如下:给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为C。应如何选择装入背包的物品,使装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。0-1背包问题形式化描述如下:给定C>0,wi>0,vi>0(1≤i≤n),要求n元0-1向量(x1,x2…xn),xi∈{0,1}(1≤1≤n),使得∑x≤C,而且∑达到最大。
算法设计:对于给定的n种物品的重量和价值,以及背包的容量,计算可装入背包的最大价值。
数据输入:由文件 input. txt给出输入数据。第1行有2个正整数n和c,n是物品数,c是背包的容量。接下来的1行中有n个正整数,表示物品的价值。第3行中有n个正整数,表示物品的重量。
结果输出:将计算的装入背包物品的最大价值和最优装入方案输出到文件 output. txt
输入文件示例
input.txt
5 10
6 3 5 4 6
2 2 6 5 4
输出文件
output.txt
15
1 1 0 0 1
举例:假设v=20,w={5,6,3,7,8},p={6,7,4,8,9},则最大价值为23
/*
0-1背包问题
状态表示:
f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少
result=max{f[n][0~v]}
不选第i个物品,f[i][j] = f[i-1][j];
选第i个物品,f[i][j] = f[i-1][j-v[i]];

f[i][j] = max(1,2);

f[0][0]=0;初始化
*/

#include
#include
#include
using namespace std;

const int N = 1010;
int n, m;//n表示物品个数,m表示总共可用的背包容量
int f[N][N];
int v[N], w[N];//记录每个物品的重量和价值,重量用v表示,价值用w表示

int main() {
cout << “请分别输入物品个数和背包容量” << endl;
cin >> n >> m;
cout << “请分别输入每个物品的重量和价值(回车更换物品,具体输入格式如下图)” << endl;
for (int i = 1; i <= n; i++)
cin >> v[i] >> w[i];

for (int i = 1; i <= n; i++)//循环物品
    for (int j = 0; j <= m; j++)//枚举所有重量
    {
        f[i][j] = f[i - 1][j];//不选第i物品
        if (j >= v[i])//j表示剩余重量,v[i]表示第i物品重量
            f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);//选第i物品
    }

int res = 0;
for (int i = 0; i <= m; i++) res = max(res, f[n][i]);
cout << res << endl;
system("pause");//防止程序退出
return 0;

}在这里插入图片描述
(2)使用分治法解决排序问题
问题:有一组无序的整数,现设计一种算法使该组数有序。
举例:原数据为1 6 5 2 3 8 7 9,排序后的数据为1 2 3 5 6 7 8 9
(3)单源最短路径
问题:给定一个带权有向图G=(V,E)。其中每条边的权是非负实数。另外还给定v中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。
举例:假设输入一个带权有向图的二维数组,输出单源最短路径的长度。
(4)使用动态规划算法解决如下问题
问题:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。当z既是x的子序列又是y的子序列是,称z为x和y的公共子序列。现给定两个序列x和y,求x和y的最长公共子序列的长度。
举例:x={A,B,C,B,D,A,B},y={B,D,C,A,B,A},则输出4
(5)使用动态规划算法解决如下问题
问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…,n-1,求矩阵相乘至少需要多少次数乘?
举例:A1 10100,A2 1005,A3 550,则A1A2*A3至少需要7500次数乘。
(6)使用分治法解决如下问题
问题:将正整数n表示成一系列正整数之和n=n1+n2+…+nk(其中,n1>=n2>=…>=nk>=1,k>=1),求任意正整数n的划分数(n<10)。
举例:整数5有如下5种划分:
5=4+1,5=3+2,5=3+1+1,5=2+1+1+1,5=1+1+1+1+1
(7)使用二分搜索算法解决如下问题
问题:给定一个已排好序的n个元素,现要在这n个元素种找出一个指定的元素x。
举例:1 2 3 5 6 7 8 9 ,如输入5则输出4,如输入10,则输出false。
(8)使用贪心算法解决如下问题
问题:有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为wi。最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
举例:假设c=20,w={5,6,7,8,9},则输出 5 6 7
(9)使用回溯法解决如下问题
问题:某售货员要到若干城市去推销商品,已知各城市之间的路程。他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。城市数量小于5个。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶梓粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值