大型揹包

題目 卡迪亞的遊戲

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章