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