P2722 [USACO3.1]總分 Score Inflation

 

題目背景

選手在我們 USACO 的競賽中的得分越多我們越高興。

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

題目描述

我們可以從幾個種類中選取競賽的題目,這裏的一個"種類"是指一個競賽題目的集合,解決集合中的題目需要相同多的時間並且能得到相同的分數。

你的任務是寫一個程序來告訴 USACO 的職員,應該從每一個種類中選取多少題目,使得解決題目的總耗時在競賽規定的時間裏並且總分最大。

輸入格式

輸入的第一行是用空格隔開的兩個整數,分別代表競賽時間 mmm 和題目總數 nnn。

第 222 到第 (n+1)(n + 1)(n+1) 行,每行兩個用空格隔開的整數,第 (i+1)(i + 1)(i+1) 行的整數 pi,tip_i, t_ipi​,ti​ 分別代表解決第 iii 道題得到的分數和需要花費的時間。

輸出格式

輸出一行一個整數,代表最大的總分。

輸入輸出樣例

輸入 #1

300 4
100 60
250 120
120 100
35 20

輸出 #1

605

說明/提示

數據規模與約定

對於 100%100\%100% 的數據,保證 1≤n≤1041 \leq n \leq 10^41≤n≤104,1≤pi,ti≤1041 \leq p_i, t_i \leq 10^41≤pi​,ti​≤104。

完全揹包問題,注意看題

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <map>
#define sf(a) scanf("%d\n",&a)
#define rep(i,a,b) for(i=a;i<=b;i++)
#define e 1e-8
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
const int idata=1e4+5;

int i,j,k;
int judge,flag,temp;
//vector<ll>step(idata);
//ll step[idata];
int dp[idata];
int valu[idata],wigh[idata];
ll n,m,t,x,y;
ll maxx=-inf,minn=inf;
ll cnt,len,ans,sum;
priority_queue< int, vector<int> , greater<int> >q;
string s;

int main()
{
    while(cin>>m>>n)
    {
        for(i=1;i<=n;i++)
            cin>>valu[i]>>wigh[i];
        for(i=1;i<=n;i++)
        {
            for(j=wigh[i];j<=m;j++)
                dp[j]=max(dp[j],dp[j-wigh[i]]+valu[i]);
        }
        cout<<dp[m]<<endl;
    }
    return 0;
}

 

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