#1038 : 01揹包
描述
且說上一週的故事裏,小Hi和小Ho費勁心思終於拿到了茫茫多的獎券!而現在,終於到了小Ho領取獎勵的時刻了!
小Ho現在手上有M張獎券,而獎品區有N件獎品,分別標號爲1到N,其中第i件獎品需要need(i)張獎券進行兌換,同時也只能兌換一次,爲了使得辛苦得到的獎券不白白浪費,小Ho給每件獎品都評了分,其中第i件獎品的評分值爲value(i),表示他對這件獎品的喜好值。現在他想知道,憑藉他手上的這些獎券,可以換到哪些獎品,使得這些獎品的喜好值之和能夠最大。
輸入
每個測試點(輸入文件)有且僅有一組測試數據。
每組測試數據的第一行爲兩個正整數N和M,表示獎品的個數,以及小Ho手中的獎券數。
接下來的n行描述每一行描述一個獎品,其中第i行爲兩個整數need(i)和value(i),意義如前文所述。
測試數據保證
對於100%的數據,N的值不超過500,M的值不超過10^5
對於100%的數據,need(i)不超過2*10^5, value(i)不超過10^3
輸出
對於每組測試數據,輸出一個整數Ans,表示小Ho可以獲得的總喜好值。
5 1000 144 990 487 436 210 673 567 58 1056 897樣例輸出
2099
#include <bits/stdc++.h> using namespace std; typedef long long ll ; typedef double dl ; #define INF 0x7f const int maxn =1e5+5; const int mod = 1000000007; #define f(i,l,r) for(int i=l;i<=r;++i) #define g(i,l,r) for(int i=l;i>=r;--i) int n ,money; int cost[maxn],value[maxn]; int dp[maxn]; int main() { freopen("in","r",stdin); freopen("out","w",stdout); cin>>n>>money; f(i,1,n) cin>>cost[i]>>value[i]; f(i,1,n) g(j,money,cost[i]) dp[j] =max(dp[j],dp [j-cost[i]]+value[i]); cout<<dp[money]<<endl; return 0; }