《蓝桥杯》30天拿下Python算法设计与分析【Day 13】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

做你想做的错的算我的

这里是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背包与完全背包其实差异不大主要是状态转移函数有个微小的差别其他都基本不变。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python

“《蓝桥杯》30天拿下Python算法设计与分析【Day 13】” 的相关文章