动态规划实现 01背包问题

★问题描述 给定n种物品和一背包。物品i的重量是weight[i],其价值为value[i],背包的容量为capacity。问:应该如何选择装入背包的物品(这些物品每样只有一件,要么被装入要么被留下),使得装入背包中物品的总价值最大?
★格式输入 Capacity numGoodsweight[1] value[1]weight[2] value[2]......
★格式输出 第一行1个数字,表示总最大价值。
第二行共n个数字,表示所选的物品。
★样例输入 10 5
2 6
2 3
6 5
5 4
4 6
★样例输出 15
1 2 5
★算法设计(包括算法设计过程中相关内容的说明、数据结构的选择、 算法详细描述及算法分析):
●1.设计说明:
1.1最优子结构性质:设(x1,x2,...,xn)是所给0-1背包问题的一个最优解,则(x1,x2,...,xn-1)是下列子问题的最优解。
1.2递归公式:
m(i,j)是背包容量为j,可选择前i 个物品时0-1背包问题的最优值,由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下:
m(i,j) = m(i-1,j) // 0<= j <weight[i];
max{m(i-1,j),m(i-1,j-weight[i])+value[i]} //j >= weight[i]
●2.算法设计:
●2.1数据结构:
int capacity; //背包容量
int numGoods; //物品数量
int max[MAX_NUM][MAX_CAPACITY];//记录递归中间结果
int weight[MAX_NUM]; //物品重量
int value[MAX_NUM]; //物品价值
int chose[MAX_NUM]; //记录物品是否被选中,为1则选中,为0未被选中
int maxValue; //背包中物品的最大价值
●2.2算法描述:
input(numGoods,weight,value);//读入数据
printInitData(capacity,numGoods,weight,value,max);//打印初始化后的数据
dKnap(maxValue,max,capacity,numGoods,weight,value); //求解背包问题
traceBack(chose,numGoods,capacity,max);//判断物品是否被选中
printResult(numGoods,capacity,maxValue,max,chose);//打印计算结果
//计算并保存最优子结构
for(int i = 1; i <= numGoods; i++)
{
for(int j = 1; j <= capacity; j++)
{
if(j < weight[i])
m(i,j) = m(i-1,j);
else if(j >= weight[i])
m(i,j) = max{m(i-1,j),m(i-1,j-weight[i])+value[i]};
}
}
//判断物品是否被选中
if(max[i][capacity] == max[i-1][capacity])
chose[i] = 0;
else
{
chose[i] = 1;
capacity -= weight[i];
}
●2.3算法分析
Dknap()函数的复杂度为O(nc) 其中c = capacity
traceBack()复杂度为O(n)
本算法的最坏时间复杂度为:O(nc)
最坏空间复杂度为:O(nc)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值