今天,我又去刷水题了。水题好多呀!这些题分为N个难度级别,做出第i个难度级别的任意一题都需要a[i]分钟,并获得b[i]点积分。我最多可以刷T分钟水题,问我最多能获得多少积分?

【输入】

第一行两个正整数N和T,接下来的N行每行两个正整数数a[i]和b[i]。

【输出】

一个数,表示我最多可以获得的积分。

【样例输入】

4 50

1 10

3 40

9 130

27 400

【样例输出】

720

题解:

直接上代码(没错,就是这么简单)

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

我把这段代码稍微改一下,就变成了刷水题(一)的一个更好的解,不信试试

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