洛谷 P2722 总分题解
題目描述
我們可以從幾個種類中選取競賽的題目,這里的一個"種類"是指一個競賽題目的集合,解決集合中的題目需要相同多的時間并且能得到相同的分數。你的任務是寫一個程序來告訴USACO的職員,應該從每一個種類中選取多少題目,使得解決題目的總耗時在競賽規定的時間里并且總分最大。輸入包括競賽的時間,M(1 <= M <= 10,000)(不要擔心,你要到了訓練營中才會有長時間的比賽)和N,"種類"的數目1 <= N <= 10,000。后面的每一行將包括兩個整數來描述一個"種類":
第一個整數說明解決這種題目能得的分數(1 <= points <= 10000),第二整數說明解決這種題目所需的時間(1 <= minutes <= 10000)。
你的程序應該確定我們應該從每個"種類"中選多少道題目使得能在競賽的時間中得到最大的分數。
來自任意的"種類"的題目數目可能是任何非負數(0或更多)。
計算可能得到的最大分數。
輸入格式
第 1 行: M, N--競賽的時間和題目"種類"的數目。
第 2-N+1 行: 兩個整數:每個"種類"題目的分數和耗時。
輸出格式
單獨的一行包括那個在給定的限制里可能得到的最大的分數。
輸入輸出樣例
輸入 #1復制 300 4 100 60 250 120 120 100 35 20 輸出 #1復制 605說明/提示
題目翻譯來自NOCOW。
USACO Training Section 3.1
?
題解
這是道完全背包模板題。把競賽時間看做背包容量,每個種類的題目看做物品,每個物品可以被選擇,也可以不選。
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 }?
轉載于:https://www.cnblogs.com/zealsoft/p/11440385.html
總結
以上是生活随笔為你收集整理的洛谷 P2722 总分题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过NGINX location实现一个
- 下一篇: Unity Shader 屏幕后效果——