算法基础之python实现贪心算法中圣诞老人分糖果问题和二分查找算法中烘干衣服问题

一、贪心算法二分查找算法

二、圣诞老人分糖果问题

2.1、问题描述

2.2、问题分析

2.3、程序代码

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 20 09:21:59 2018

@author: lizihua

题目:圣诞节来临,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果都有自己
的价值和重量,且每箱糖果都可以拆分成任意组合带走,但圣诞老人的驯鹿最多只能承受
一定重量的糖果,问圣诞老人最多能带走多大价值的糖果。
输入(n、W、v、w都是整数):
第一行:n(糖果箱子数量)和W(驯鹿最多能承受的重量)
剩下n行:v(一箱糖果的价值)和w(一箱糖果的重量)
输出:
圣诞老人能带走糖果的最大价值,保留一位小数

"""
import numpy as np

nW=input("请输入糖果箱子数量和驯鹿最大能承受的重量:").split(' ')
nW = list(map(int, nW))
n=nW[0]
W=nW[1]
#输入每箱糖果的价值和重量
vw=[[0,0]]*n
for i in range(n):
    vw[i]=input("请输入第"+str(i+1)+"箱糖果的价值和重量:").split(' ')
    vw[i]=list(map(float,vw[i]))

print(vw)
vw=np.array(vw)
density=np.zeros(4)

for i in range(4):
    density[i]=vw[i][0]/vw[i][1]
a=np.insert(vw,2,density,axis=1)

print("添加单位重量价值后的数组:\n",a)
box=a[np.lexsort(-a.T)]       #按最后一列从大到小排序,且不改变行完整性

print("按照单位重量价值排序所得数组:\n",box)
totv=totw=0
#按单位重量价值从大到小依次放入
for i in range(n):
    if totw+box[i][1]

2.4、结果显示

三、烘干衣服问题

3.1、问题描述

3.2、问题分析:

3.3、程序代码

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 20 14:52:18 2018

@author: lizihua

题目:有n件衣服需要烘干,每件衣服的含水量为a[i],
自然烘干每分钟含水量减少1,用烘干机烘干时每分钟含水量减少k(直至为0)
只有一台烘干机,每次只能烘干一件衣服,且一次至少使用1分钟
求所有衣服含水量为0的最少时间
输入:
第一行:n(衣服数量)
第二行:n件衣服的含水量a[i]
第三行:k(使用烘干机时一分钟含水量的减少)
输出:
至少需要的时间

*********************************************
介绍以下python中的常见取整函数:              *
(1)四舍五入取整:round()                     *
(2)向下取整:int()                           *
(3)向上取整:math.ceil()                     *
*********************************************
"""
import math
n=int(input("请输入衣服的总数量:"))
a=input("请输入每件衣服的含水量:").split(' ')
a = list(map(int, a))
k=int(input("请输入烘干机一分钟含水量减少值:"))

#判断时间为ans是否可行
def check(ans):
    now=0     #需要烘干机的时间
    for i in range(n):
        if a[i] > ans:
            now+=math.ceil((a[i]-ans)/(k-1))
            if now > ans:
                return 0
    return 1

l=0
r=max(a)
#k=1时,避免除零情况,直接输出
if k==1:
    print("最少时间为:",r)
else:
    while(l<=r):
        mid=math.ceil((r+l)/2)
        if check(mid):
            r=mid-1
        else:
            l=mid+1
    print("最少时间为:",l)

3.4、结果显示



你可能感兴趣的:(算法基础)