大型揹包

题目 卡迪亚的游戏

2020年真的可怕的一年,新型冠状病毒从年初开始席卷全球。受到新型冠状病毒影响,卡迪亚积极响应号召,待在家里不出门(其实就是懒的一个借口)。4月24日,被洛谷折磨得不堪的他想玩一会游戏来放松放松,于是他打开了steam寻找他喜爱的游戏。但游戏实在太多了,而且贪玩的他想把所有游戏都下载下来玩一玩。但卡迪亚的电脑硬盘空间(W)有限,不能把游戏都下载下来,他把每个游戏需要的硬盘大小(wi)和自己对它的喜爱程度(vi)列了一个表给你,请聪明的你帮他算一算他下载的游戏的喜爱程度总和最大值是多少?
Input
第一行两个整数:游戏总数n(1<=n<=100) , 电脑硬盘空间W(1<=W<=1000000000)。
之后有n行,每行两个整数,分别表示第i个游戏所需的硬盘空间(1<=wi<=10000000)和自己对它的喜爱程度(1<=vi<=100)。
Output
一个整数,表示下载的游戏的喜爱程度总和最大值。
Sample Input
6 10
2 5
3 4
1 6
2 4
2 8
2 1
Sample Output
27
Hint
样例中,选择前五个游戏即可使总喜爱程度为27。
我们可以清晰的看到W的最大值为1e9 数组是开不出来的!!!!所以不能直接dp【容量】,反向dp【价值】
上代码

#include<bits/stdc++.h>
#define pk push_back
typedef long long ll;
using namespace std;
#define inf 0x3f3f3f3f
ll dp[10010];
int main()
{
	int n;
	ll w[105],v[105],m,sum=0;
	cin>>n>>m;
	for(int i=1;i<=10000;i++)
	dp[i]=inf;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>v[i];
		sum+=v[i];
	}
	dp[0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=sum;j>=v[i];j--)
		dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
	}
	for(int i=sum;i>=0;i--)
	{
		if(dp[i]<=m)
		{
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章