洛谷 P2722 總分題解

題目描述

咱們能夠從幾個種類中選取競賽的題目,這裏的一個"種類"是指一個競賽題目的集合,解決集合中的題目須要相同多的時間而且能獲得相同的分數。你的任務是寫一個程序來告訴USACO的職員,應該從每個種類中選取多少題目,使得解決題目的總耗時在競賽規定的時間裏而且總分最大。輸入包括競賽的時間,M(1 <= M <= 10,000)(不要擔憂,你要到了訓練營中才會有長時間的比賽)和N,"種類"的數目1 <= N <= 10,000。後面的每一行將包括兩個整數來描述一個"種類":ios

第一個整數說明解決這種題目能得的分數(1 <= points <= 10000),第二整數說明解決這種題目所需的時間(1 <= minutes <= 10000)。spa

你的程序應該肯定咱們應該從每一個"種類"中選多少道題目使得能在競賽的時間中獲得最大的分數。翻譯

來自任意的"種類"的題目數目多是任何非負數(0或更多)。code

計算可能獲得的最大分數。orm

輸入格式

第 1 行: M, N--競賽的時間和題目"種類"的數目。blog

第 2-N+1 行: 兩個整數:每一個"種類"題目的分數和耗時。ci

輸出格式

單獨的一行包括那個在給定的限制裏可能獲得的最大的分數。input

輸入輸出樣例

輸入 #1
300 4
100 60
250 120
120 100
35 20
輸出 #1
605

說明/提示

題目翻譯來自NOCOW。string

USACO Training Section 3.1it


 

題解

這是道徹底揹包模板題。把競賽時間看作揹包容量,每一個種類的題目看作物品,每一個物品能夠被選擇,也能夠不選。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <string.h>
 6 
 7 using namespace std;
 8 
 9 const int    MAXN = 1e5 + 5;
10 int        m, n, s[MAXN], t[MAXN], f[MAXN];
11 
12 int main()
13 {
14     cin >> m >> n;
15     for ( int i = 1; i <= n; i++ )
16     {
17         cin >> s[i] >> t[i];
18     }
19     for ( int i = 1; i <= n; i++ )
20     {
21         for ( int j = t[i]; j <= m; j++ )
22         {
23             f[j] = max( f[j], f[j - t[i]] + s[i] );
24         }
25     }
26     cout << f[m] << endl;
27     return(0);
28 }
相關文章
相關標籤/搜索