做你想做的,错的算我的
这里是Want595,欢迎光临我的世界 ~
系列文章目录
《蓝桥杯》30天拿下Python算法设计与分析
目录
系列文章目录
前言
0-1背包问题
问题引入
程序设计
完全背包问题
问题引入
程序设计
总结
前言
本文介绍动态规划的一类典型题型:背包问题,具体分为0-1背包和完全背包两种。
0-1背包问题
每个物品有且仅有一个
问题引入
【问题描述】
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
【输入形式】
第一行输入物品的个数n和背包容量C。
第二行输入每个物品的价值v[i].
第三行输入每个物品的重量w[i]
【输出形式】
第一行输出最大价值。
【样例输入】
4 7
9 10 7 4
3 5 2 1
【样例输出】
20
程序设计
def bag(n,C,vi,wi):
results=[[0 for i in range(1+C)] for j in range(1+n)]
for i in range(1,1+n):
for j in range(1+C):
if j<wi[i-1]:
results[i][j]=results[i-1][j]
else:
results[i][j]=max(results[i-1][j],results[i-1][j-wi[i-1]]+vi[i-1])
return results[-1][-1]
n,C=map(int,input().split())
vi=[int(i) for i in input().split()]
wi=[int(i) for i in input().split()]
res=bag(n,C,vi,wi)
print(res)
算法分析
状态转移函数:results[i][j]=max(results[i-1][j],results[i-1][j-wi[i-1]]+vi[i-1])
完全背包问题
每样物品有n个(可以理解为无穷个,随便取)
问题引入
【问题描述】
对于吃货来说,过年最幸福的事就是吃了,没有之一!
但是对于女生来说,卡路里(热量)是天敌啊!
资深美女湫湫深谙“胖来如山倒,胖去如抽丝”的道理,所以她希望你能帮忙制定一个食谱,能使她吃得开心的同时,不会制造太多的天敌。
当然,为了方便你制作食谱,湫湫给了你每日食物清单,上面描述了当天她想吃的每种食物能带给她的幸福程度,以及会增加的卡路里量。
【输入形式】
输入包含多组测试用例。
每组数据以一个整数n开始,表示每天的食物清单有n种食物。
接下来n行,每行两个整数a和b,其中a表示这种食物可以带给湫湫的幸福值(数值越大,越幸福),b表示湫湫吃这种食物会吸收的卡路里量。
最后是一个整数m,表示湫湫一天吸收的卡路里不能超过m。
[Technical Specification] 1. 1 <= n <= 100 2. 0 <= a,b <= 100000 3. 1 <= m <= 100000
【输出形式】
对每份清单,输出一个整数,即满足卡路里吸收量的同时,湫湫可获得的最大幸福值。
【样例输入】
3
3 3
7 7
9 9
10
5
1 1
5 3
10 3
6 8
7 5
6
【样例输出】
10
20
程序设计
def maxHappiness(n,m,Happiness,Calorie):
t_results=[0 for i in range(m+1)]
for i in range(1,m+1):
if i<Calorie[0]:
t_results[i]=0
else:
while (t_results[i]+Happiness[0])<=i:
t_results[i]+=Happiness[0]
print(t_results)
for i in range(1,n):
results=[0 for i in range(m+1)]
for j in range(1,m+1):
if j<Calorie[i]:
results[j]=t_results[j]
else:
results[j]=max(t_results[j],results[j-Calorie[i]]+Happiness[i])
t_results=results
print(results)
return results[-1]
n=int(input())
Happiness=[]
Calorie=[]
for i in range(n):
a,b=map(int,input().split())
Happiness.append(a)
Calorie.append(b)
m=int(input())
res=maxHappiness(n,m,Happiness,Calorie)
print(res)
算法分析
状态转移函数: results[j]=max(t_results[j],results[j-Calorie[i]]+Happiness[i])
总结
0-1背包与完全背包其实差异不大,主要是状态转移函数有个微小的差别,其他都基本不变。