今天,我又去刷水题了。水题好多呀!这些题分为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 }