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