邪惡的Sidney

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;  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章