題目背景
選手在我們 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;
}