【洛谷P2722 USACO】 總分 01揹包模板

P2722 總分 Score Inflation


題目背景

學生在我們USACO的競賽中的得分越多我們越高興。

我們試着設計我們的競賽以便人們能儘可能的多得分,這需要你的幫助

題目描述

我們可以從幾個種類中選取競賽的題目,這裏的一個"種類"是指一個競賽題目的集合,解決集合中的題目需要相同多的時間並且能得到相同的分數。你的任務是寫一個程序來告訴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

01揹包模板題,很水很水。。。

如果揹包問題又不懂得,煩請移步很有名氣的《揹包九講》,如找不到最新版資源,請私信、評論或Q(568251782)我。


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>

const int INF = 99999999;
const int MAXM = 10000 + 10;
const int MAXN = 10000 + 10;

//01揹包,將時間作爲V,分數作爲W
int m,n;
int f[MAXM];
int V[MAXN];
int W[MAXN];
int ans;

int main()
{
	scanf("%d%d", &m, &n);
	for(int i = 1;i <= n;i++)
	{
		scanf("%d%d", &W[i], &V[i]);
	}
	for(int i = 1;i <= n;i++)
	{
		for(int j = m;j >= V[i];j--)
		{
			f[j] = std::max(f[j], f[j-V[i]]+ W[i]);
		}
	}
	ans = -9999999;
	for(int i = 1;i <= m;i++)
	{
		ans = std::max(ans, f[i]);
	}
	printf("%d", ans);
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章