动态规划

您所在的位置:网站首页 等高线地形图的原理 动态规划

动态规划

#动态规划| 来源: 网络整理| 查看: 265

之前简单介绍了一下0/1背包问题,详情可见动态规划——0/1背包问题。

但是后来在做华为机考的另一道题,发现这道题需要用有依赖的背包问题来解决,接下来我为大家简单介绍一下这道题以及如何用有依赖的背包问题来解决。

一、题目描述

王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。     设第 j 件物品的价格为 v[j] ,重要度为 w[j] ,共选中了 k 件物品,编号依次为 j1 , j2 ,……, jk ,则所求的总和为: v[j1 ]*w[j1 ]+v[j2 ]*w[j2 ]+ … +v[jk ]*w[jk ] 。(其中 * 为乘号)     请你帮助王强设计一个满足要求的购物单。 输入描述

输入的第 1 行,为两个正整数,用一个空格隔开:N m

(其中 N (  [(),(1,),(2,),(3,),(1,2,),(1,3),(2,3),(1,2,3)] s = list(iterable) return list(chain.from_iterable(combinations(s,r) for r in range(len(s)+1)))

 

记下来写主代码:

初始化:

from collections import defaultdict capacity,num = list(map(int,input().split())) p = [0] # 价格 w = [0] # 重要程度 c = [0] # 从属关系 d = defaultdict(list) # d[key] 默认为[] for i in range(num): price,weight,cate = list(map(int,input().split())) p += [price] w += [weight] c += [cate]

 

 

分组:

for i in range(1,num+1): if c[i] == 0: d[i] =[] for i in range(1,num+1): if c[i] != 0: d[c[i]].append(i) groups = [[0]] # 分组 for k,v in d.items(): l = powerset(v) l = list(map(lambda x: x+(k,),l)) groups.append(l)

 

 

动态规划:

table = [[0 for column in range(int(capacity//10)+1)] for row in range(len(groups))] for i in range(1,len(groups)): for j in range(1,int(capacity//10)+1): competition = [table[i-1][j]] for group in groups[i]: sum_price = 0 sum_weight_price = 0 for item in group: sum_price += p[item] # 把每个item价格加起来 sum_weight_price+=p[item]*w[item] if j*10 >= sum_price: competition += [table[i-1][j-int(sum_price/10)]+sum_weight_price] #加上一个group的对应值 table[i][j] = max(competition) print(table[-1][-1])

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3