刷水題(一)


今天,為了沖排行榜,我去刷水題了。我一共看到了N道水題,做出第i道題需要a[i]分鍾,並獲得b[i]點積分。我最多可以刷T分鍾水題,問我最多能獲得多少積分?

【輸入】

第一行兩個正整數N和T,接下來的N行每行兩個正整數數a[i]和b[i]。

【輸出】

一個數,表示我最多可以獲得的積分。

【樣例輸入】

4 30

11 5

31 1000

11 10

11 15

【樣例輸出】

25

題解:

我看這道題也挺水的。

01背包,不懂的上百度搜一搜看下面:

具體思路如下:

我做了第i題,沒做的就少了第i題,

問題的N就少了1,T就少了a[i],總積分增加了b[i]。

用一個dp二維數組存儲積分(dp[i][j]表示當剩下j分鍾時,前i道題能獲得的最大積分數)

代碼在此↓↓↓

 1 #include<iostream>
 2 using namespace std;
 3 int dp[1005][1005];
 4 int a[1005],b[1005];
 5 int n,t;
 6 int main()
 7 {
 8     cin>>n>>t;
 9     int i,j;
10     for(i=1;i<=n;i++)
11         cin>>a[i]>>b[i];
12     for(i=1;i<=n;i++)
13         for(j=0;j<=t;j++)
14             if(a[i]<=j)
15                 dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+b[i]);
16     cout<<dp[n][t];
17     return 0;
18 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM