Time Limit: 1000ms
Memory Limit: 65M
Description:
時間過得很快,又到了星期二——掛新training的日子。Sidney手裏有很多備選題,每道題都有一個標程長度和難度係數,邪惡的Sidney希望在表面看起來難度不超過規定(標程長度和不超過規定)的情況下,實際的難度(標程長度*難度係數之和)最大,你能幫幫他嗎?
抽象的,我們設第j道的標程長度爲v[j],難度係數爲w[j],共選中了k道題,編號依次爲j1,j2,……,jk,則所求爲:
v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]最大
Input:
輸入的第1行,爲兩個正整數,用一個空格隔開:N m(1 <= N <= 30000)表示預計標程長度之和不能超過的總長度,m(1 <= m <= 25)爲備選的題的個數。)
從第2行到第m+1行,第j行給出了編號爲j-1的題的基本數據,每行有2個非負整數 v p(其中v表示該題的標程長度 (1 <= v<=10000),p表示該題的難度係數(1~5))
Output:
輸出只有一個正整數,爲標程長度與難度係數乘積之和的最大值(<1e8)
Sample Input:
1000 5
800 2
400 5
300 5
400 3
200 2
Sample Output:
3900
Hint:
Sidney:這題不是我出的,你們出題能不能黑自己
#include <iostream>
using namespace std;
int n,m,v,p,f[30003];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>v>>p;
for(int j=n;j>=v;j--)
f[j]=max(f[j],f[j-v]+v*p);
}
cout<<f[n]<<endl;
return 0;
}