题目概述:
A programming competition site AtCode provides algorithmic problems. Each problem is allocated a score based on its difficulty. Currently, for each integer i between 1 and D (inclusive), there are p_i problems with a score of 100i points. These p_1 + …+p_D problems are all of the problems available on AtCode.
A user of AtCode has a value called total score. The total score of a user is the sum of the following two elements:
- Base score: the sum of the scores of all problems solved by the user.
- Perfect bonuses: when a user solves all problems with a score of 100i points, he/she earns the perfect bonus of c_i points, aside from the base score (1 ≤ i ≤ D).
Takahashi, who is the new user of AtCode, has not solved any problem. His objective is to have a total score of GG or more points. At least how many problems does he need to solve for this objective?
题目大意:
有一个刷题的人遇到了D种问题,第i个问题有p_i个,解决第i种问题可以得到i*100的基础分,解决了所有的p_i个问题可以得到c_i分,问最少解决几个问题才能使总得分超过G?
数据范围:
- 1≤D≤10
- 1 ≤ p_i ≤ 100
- 100 ≤ c_i ≤ 10^6
- 100 ≤ G
- All values in input are integers.
- c_i and G are all multiples of 100.
- It is possible to have a total score of G or more points
输入样例:
样例1:
Input | Output |
---|---|
2 700 3 500 5 800 | 3 |
In this case, there are three problems each with 100points and five problems each with 200 points. The perfect bonus for solving all the 100-point problems is 500 points, and the perfect bonus for solving all the 200-point problems is 800 points. Takahashi's objective is to have a total score of 700 points or more.
One way to achieve this objective is to solve four 200-point problems and earn a base score of 800 points. However, if we solve three 100-point problems, we can earn the perfect bonus of 500 points in addition to the base score of 300 points, for a total score of 800 points, and we can achieve the objective with fewer problems.
样例2:
Input | Output |
---|---|
2 2000 3 500 5 800 | 7 |
This case is similar to Sample Input 1, but the Takahashi's objective this time is 2000 points or more. In this case, we inevitably need to solve all five 200 point problems, and by solving two 100-point problems additionally we have the total score of 2000 points.
样例3:
Input | Output |
---|---|
2 400 3 500 5 800 | 2 |
This case is again similar to Sample Input 1, but the Takahashi's objective this time is 400 points or more. In this case, we only need to solve two 200-point problems to achieve the objective.
样例4:
Inputcopy | Outputcopy |
---|---|
5 25000 20 1000 40 1000 50 1000 30 1000 1 1000 | 66 |
There is only one 500 point problem, but the perfect bonus can be earned even in such a case.
思路:
动态规划:
抽象处理:
有D种物品,第i种物品有p_i个,拿一个第i种物品可得到i*100的重量,1的价值。
拿完第i种物品可额外增加c_i的重量。要使重量超过容量且价值最小。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int D,G;
int p[101],c[101],d[10000001];
int main()
{
cin>>D>>G;
for(int i=1;i<=D;i++)
{
cin>>p[i]>>c[i];
c[i]/=100;
}
memset(d,0x3f,sizeof(d));d[0]=0;
for(int i=1;i<=D;i++)
{
for(int j=G/100;j>=0;j--)
{
for(int k=1;k<=p[i];k++)
{
int tmp=k*i;
if(k==p[i]) tmp+=c[i];
if(tmp>j)
{
tmp=j;
}
d[j]=min(d[j],d[j-tmp]+k);
}
}
}
cout<<d[G/100];
return 0;
}