但是你要备份的资料却有很多,你只能备份其中的一部分。
为了选择要备份哪些文件,你给所有文件设置了一个价值 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)]