日常題目-刷水題
阿新 • • 發佈:2018-08-20
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 }
日常題目-刷水題