題目 卡迪亞的遊戲
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;
}