1. 程式人生 > >日常題目-刷水題

日常題目-刷水題

01背包 col cor ext 整數 接下來 分數 cout lin

今天,為了沖排行榜,我去刷水題了。我一共看到了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 }

日常題目-刷水題