4700. 何以包邮?

4700. 何以包邮?

新学期伊始,适逢顿顿书城有购书满 x
元包邮的活动,小 P
同学欣然前往准备买些参考书。

一番浏览后,小 P
初步筛选出 n
本书加入购物车中,其中第 i
本(1i≤n
)的价格为 ai
元。

考虑到预算有限,在最终付款前小 P
决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m
在满足包邮条件(m≥x
)的前提下最小。

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

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

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

输入数据保证 n
本书的价格总和不小于 x
。

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

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

输入样例14 100
20
90
60
60
输出样例1110
样例1解释
购买前两本书 (20+90)
即可包邮且花费最小。

输入样例23 30
15
40
30
输出样例230
样例2解释
仅购买第三本书恰好可以满足包邮条件。

输入样例32 90
50
50
输出样例3100
样例3解释
必须全部购买才能包邮。

难度:简单
时/空限制:1s / 64MB
总通过数:1752
总尝试数:3566
来源:第27次CCF计算机软件能力认证
算法标签

01背包

#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
const int N=40*10000;
int dp[N];
int num[40];

int main()
{
    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;
        }
    }
    return 0;
}
posted @   认真游泳的鱼  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示