5.1 背包问题

1.实验目的

2.实验内容

2.1 问题描述

给定一组物品,在背包限重内,使放入物品的总价格最高。

2.2 问题分析

对每一件物品遍历背包容量,当背包可容纳值大于等于当前物品时,与之前已放进去的物品所得价值进行对比:

  • 如果当前物品价值大于背包中物品价值,进行置换
  • 否则不置换

3.实验过程及结果

3.1 数据输入

def getdata():
    n = int(input("请输入物品个数:"))
    c = int(input("请输入书包的容量:"))
    w = []
    v= []
    for i in range(1, n + 1):
        dis1 = int(input("请输入第{}个物品的重量:".format(i)))
        w.append(dis1)
        dis2 = int(input("请输入第{}个物品的价值:".format(i)))
        v.append(dis2)
    return n,c,w,v

从键盘输入物品个数,背包容量,物品重量,物品价值。因为如果物品重量大于背包容量则不会装入背包,所以不需加条件限制。

3.2 实验代码

def bag(n, c, w, v):
    value = [[0 for j in range(c + 1)] for i in range(n + 1)]
    for i in range(1, n + 1):
        for j in range(1, c + 1):
            value[i][j] = value[i - 1][j]
            if j >= w[i - 1] and value[i][j] < value[i - 1][j - w[i - 1]] + v[i - 1]:
                value[i][j] = value[i - 1][j - w[i - 1]] + v[i - 1]
    return value

def show(n, c, w, value):
    print('背包物品最大价值为:', value[n][c])
    x = [False for i in range(n)]
    j = c
    for i in range(n, 0, -1):
        if value[i][j] > value[i - 1][j]:
            x[i - 1] = True
            j -= w[i - 1]
    print('装入物品为:')
    for i in range(n):
        if x[i]:
            print('第', i+1, '个,', end='')

回溯法,从尾遍历物品,当value大于上一行同样位置的value时,表示放进该物品

3.3 实验结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值