新学期伊始,适逢顿顿书城有购书满 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
。
输出格式
仅输出一个正整数,表示在满足包邮条件下的最小花费。
数据范围
70%
的测试数据满足:n≤15
;
全部的测试数据满足:n≤30
,每本书的价格 ai≤104
且 x≤a1+a2+⋯+an
。
输入样例1:
410020906060
输出样例1:
110
样例1解释
购买前两本书 (20+90)
即可包邮且花费最小。
输入样例2:
330154030
输出样例2:
30
样例2解释
仅购买第三本书恰好可以满足包邮条件。
输入样例3:
2905050
输出样例3:
100
样例3解释
必须全部购买才能包邮。
难度:简单
时/空限制:1s / 64MB
总通过数:1752
总尝试数:3566
来源:第27次CCF计算机软件能力认证
算法标签
01背包
#include<bits/stdc++.h>usingnamespace std;
typedeflonglongint ll;
constint N=40*10000;
int dp[N];
int num[40];
intmain(){
int n,m;
cin>>n>>m;
int sum=0;
for(int i=1;i<=n;i++){
cin>>num[i];
sum+=num[i];
}
dp[0]=1;
for(int i=1;i<=n;i++){
for(int k=sum;k>=num[i];k--){
dp[k]=max(dp[k-num[i]]+num[i],dp[k]);
}
}
for(int i=m;i<=sum;i++){
if(dp[i]>=m){
cout<<i<<endl;
break;
}
}
return0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具