[洛谷P2370]yyy2015c01的U盘

Posted Mrsrz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[洛谷P2370]yyy2015c01的U盘相关的知识,希望对你有一定的参考价值。

题目大意:有n个文件,每个文件有一个大小和价值,有一个容量为s的U盘,要装这些文件。传输文件需要接口,一个大小为k的接口能传输的最大文件的大小为k。问最少要多大的接口,才能使传输的文件价值$\ge p$( 具体见原题)。

解题思路:二分接口的大小,对于每个二分出的答案,做一次背包问题(如果一个文件的大小大于接口的大小,则直接跳过该文件),判断最大价值是否$\ge p$。最后的结果就是答案。在二分时,我们把r设为s+1,如果最后二分得到的答案为s,说明没有答案,输出“No Solution!”。

C++ Code:

 

#include<cstdio>
#include<cstring>
using namespace std;
int n,p,s;
int v[1005],w[1005],f[1005];
bool dp(int k){
	memset(f,0,sizeof f);
	for(int i=1;i<=n;++i)
	if(v[i]<=k)
	for(int j=s;j>=v[i];--j)
	if(f[j]<f[j-v[i]]+w[i])f[j]=f[j-v[i]]+w[i];
	return f[s]>=p;
}
int main(){
	scanf("%d%d%d",&n,&p,&s);
	for(int i=1;i<=n;++i)scanf("%d%d",&v[i],&w[i]);
	int l=0,r=s+1;
	while(l<r){
		int mid=l+r>>1;
		if(dp(mid))r=mid;else
		l=mid+1;
	}
	if(l>s)puts("No Solution!");else
	printf("%d\n",l);
	return 0;
}

 

以上是关于[洛谷P2370]yyy2015c01的U盘的主要内容,如果未能解决你的问题,请参考以下文章

P2370 yyy2015c01的U盘

P2370 yyy2015c01 的 U 盘 背包+二分

洛谷 P2372 yyy2015c01挑战算周长

P4556 [Vani有约会]雨天的尾巴 树链剖分 线段树合并

贪心洛谷P1803 凌乱的yyy

金士顿U盘PS2251-07东芝闪存白片量产CDROM成功教程-群联量产教程-U盘量产网