二分答案——yyy2015c01 的 U 盘(洛谷 P2370)

但是你要备份的资料却有很多,你只能备份其中的一部分。

为了选择要备份哪些文件,你给所有文件设置了一个价值 V_iVi​,你希望备份的文件总价值不小于 pp。

但是很快你发现这是不可能的,因为 yyy2015c01 的传输接口太小了,你只有花钱买一个更大的接口(更大的接口意味着可以传输更大的文件,但是购买它会花费更多的钱)。

注意:你的文件不能被分割(你只能把一个文件整个的传输进去,并储存在U盘中),

你放在 U 盘中文件的总大小不能超过 U 盘容量。

现在问题来了:你想知道,在满足 U 盘中文件价值之和不小于 pp 时,最小需要多大的接口。

输入格式


第 11 行,三个正整数 n,p,Sn,p,S 分别表示文件总数,希望最小价值 pp ,硬盘大小。

接下来 nn 行,每行两个正整数 W_{i},V_{i}Wi​,Vi​,表示第 ii 个文件的大小和价值。

输出格式


输出一个正整数表示最小需要的接口大小。

如果无解输出 No Solution!

输入输出样例


输入 1

3 3 5

2 2

1 2

3 2

输出 1

2

输入 2

2 3 505

1 2

500 1

输出 2

500

输入 3

3 3 2

2 2

1 2

3 2

输出 3

No Solution!

输入4

4 5 6

5 1

5 2

5 3

1 1

输出 4

No Solution!

说明/提示


1≤n,Wi​,S≤103,1≤Vi​≤106,1≤p≤10^9。

数据较小,请勿乱搞。

样例解释 1:买一个大小为 2 接口,把物品 1 、2 放进U盘。

样例解释 2:买一个大小为 500 的接口。

样例解释 3:本来可以买大小为 2 的接口,可是 U 盘容量放不下足够的文件。

解题代码: (01背包+排序)


#include

#include

using namespace std;

int n,p,s;

int dp[1005];//dp[i]表示装i体积的东西能够得到的价值

struct node

{

int v,w;

}a[1005];//在这里定义一个结构体,因为后面要用到排序

int cmp(node a,node b)

{

return a.v<b.v;//简单的排序

}

int main()

{

scanf(“%d%d%d”,&n,&p,&s);//输入对应的文件总数,希望最小价值p和硬盘大小s

for(int i=1;i<=n;i++)

scanf(“%d%d”,&a[i].v,&a[i].w);

sort(a+1,a+n+1,cmp);

for(int i=1;i<=n;i++)

for(int j=s;j>=a[i].v;j–)//01背包的模板

{

dp[j]=max(dp[j],dp[j-a[i].v]+a[i].w);

if(dp[s]>=p)//如果此时装满的情况下得到的价值已经超过了所需,

//那么当前物品的体积就是满足条件的最小体积(因为之前已经排过序了)

{

printf(“%d”,a[i].v);//直接输出,结束程序

return 0;

}

}

printf(“No Solution!”); //输出不满足条件的情况

}

未AC代码:


#include<stdio.h>

#include

#include<stdlib.h>

#include<math.h>

#include

using namespace std;

int n,p,s; //n个文件 p最小期望价值和 s为U盘容量

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

include

using namespace std;

int n,p,s; //n个文件 p最小期望价值和 s为U盘容量

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

[外链图片转存中…(img-7gtmm74s-1721169365575)]

《Java高级架构知识》

[外链图片转存中…(img-fYTgBWgI-1721169365575)]

《算法知识》

[外链图片转存中…(img-rc56OAlR-1721169365576)]

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值