All Green——绿色排名

题目概述:
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:

InputOutput
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:

InputOutput
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:

InputOutput
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:

InputcopyOutputcopy
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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值