Description
学生在我们 USACO 的竞赛中的得分越多我们越高兴。我们试着设计我们的竞赛以便人们能尽可能多得分。
现在要进行一次竞赛,总时间 T 固定,有若干类型可选择的题目,每种类型题目可选入的数量不限,每种类型题目有一个 si(解答此题所得的分数)和 ti(解答此题所需的时间),现要选择若干题目,使解这些题的总时间在 T 以内的前提下,所得的总分最大。
输入包括竞赛的时间 M (1≤M≤10000) 和题目类型数目 N (1≤N≤10000)。
后面的每一行将包括两个整数来描述一种"题型":
第一个整数说明解决这种题目能得的分数(1≤points≤10000),第二整数说明解决这种题目所需的时间(1≤minutes≤10000)。
Format
Input
第 11 行两个整数:竞赛的时间 M 和题目类型数目 N。
第 2∼N+1 行两个整数:每种类型题目的分数和耗时。
Output
单独的一行,在给定固定时间里得到的最大的分数。
Samples
输入数据 1
300 4
100 60
250 120
120 100
35 20
输出数据 1
605
Hint
从第 2 种类型中选两题和第 4 种类型中选三题。
Limitation
1s, 1024KiB for each test case.
题解:
完全背包水题,改个数据就行了完全背包问题。怎么这周作业都是H2O题啊啊啊
程序:
#include<bits/stdc++.h>
using namespace std;
int m,n,w[10010],c[10010],dp[10010][10010];//w[i]物品的重量,c[i]物品的价值,dp[j]当前物品放进去之后容量为j的背包的价值
int main() {
cin>>m>>n;
for(int i=1;i<=n;++i)
cin>>c[i]>>w[i];
for(int i=1;i<=n;i++)//遍历n个物品
for(int j=1;j<=m;j++)//j为当前背包容量 ,从后往前遍历背包
for(int k=0;k*w[i]<=j;k++)
dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*c[i]);
cout<<dp[n][m];
return 0;
}