CCF-CSP真题《202209-2 何以包邮?》思路+python满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全

试题编号:202209-2
试题名称:何以包邮?
时间限制:1.0s
内存限制:512.0MB
问题描述:

题目描述

新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。
一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n)的价格为 ai 元。
考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。

试帮助小 P 计算,最终选购哪些书可以在凑够 x 元包邮的前提下花费最小?

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 n 和 x,分别表示购物车中图书数量和包邮条件。

接下来输入 n 行,其中第 i 行(1≤i≤n)仅包含一个正整数 ai,表示购物车中第 i 本书的价格。输入数据保证 n 本书的价格总和不小于 x。

输出格式

输出到标准输出。

仅输出一个正整数,表示在满足包邮条件下的最小花费。

样例1输入

4 100
20
90
60
60

样例1输出

110

样例1解释

购买前两本书(20+90)即可包邮且花费最小。

样例2输入

3 30
15
40
30

样例2输出

30

样例2解释

仅购买第三本书恰好可以满足包邮条件。

样例3输入

2 90
50
50

样例3输出

100

样例3解释

必须全部购买才能包邮。

子任务

70% 的测试数据满足:n≤15;

全部的测试数据满足:n≤30,每本书的价格 ai≤104 且 x≤a1+a2+⋯+an。

提示

对于 70% 的测试数据,直接枚举所有可能的情况即可。

真题来源:何以包邮?

 感兴趣的同学可以如此编码进去进行练习提交

直接无脑解(70分):

# 输入购物车中的图书数量n和包邮最低值x
n, x = map(int,input().split())
# 设置a来存储每个数的价格
a = []
# 设置最低消费的价格
min_money = n*x
# 存储各种搭配的价格
cost = []
# 进行遍历,将每本书的价格依次存入a
for i in range(n):
    t = int(input())
    a.append(t)
# 对所有书本的价格进行从低到高的排序
a.sort()
# 开始遍历
for i in a:
    # 设置集合存储可能出现搭配的价格
    temp = set()
    if not cost:
        cost.append(i)
        continue
    for j in cost:
        # 判断是否小于最小的包邮值
        c = i+j
        if c<x:
            temp.add(c)
            continue
        else:
            min_money = min(min_money,c)
            break
    for k in temp:
        cost.append(k)
    cost.sort()
print(min_money)

运行结果: 

CCF-CSP真题《202209-2 何以包邮?》思路+python满分题解

错误解析:

        这种解法属于第二题看到题直白写就好,这个题解虽然有70分,但是我在写的时候没有把每一本书做标记,所以有些书可能重复购买了两次,这是不符题意的,但也有70分入手。

满分题解:

# 输入购物车中的图书数量n和包邮最低值x
n, x = map(int,input().split())
# 设置a来存储每个数的价格
a = []
# 设置动态规划数组存储每个价格的最小花费
dp = [0]*(n*x)
# 进行遍历,将每本书的价格依次存入a
for i in range(n):
    t = int(input())
    a.append(t)
# 设置pre来保存目前满足包邮的最小花费
pre = sum(a)
# 01背包解法,将每个地方的最优解存入dp数组中
for i in range(n):
    for j in range(pre,a[i]-1,-1):
        dp[j] = max(dp[j],dp[j-a[i]]+a[i])
# 从x开始遍历,找到超过x的dp[i]
for i in range(x,pre+1):
    if dp[i]>=x:
        print(dp[i])
        break

运行结果: 

CCF-CSP真题《202209-2 何以包邮?》思路+python满分题解

 题解解析:

        我在里面用了类似01背包动态规划得到概念去解的,我本来以为这种可能会出现超时现象,试了一下发现是可以成功,就用这个解了。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年3月5日 下午9:49
下一篇 2023年3月5日 下午9:51

相关推荐