列表

详情


NC24740. Making Money

描述

FJ has gone into the curio business, buying and selling knickknacks like cow Christmas tree ornaments. He knows he will sell every single curio he can stock from a catalog of N (1 <= N <= 100)
different cow curios, and he can buy as many of each kind of curio as his heart desires. He has only M (1 <= M <= 100,000) money to invest but wants to maximize his profit (which has a slightly unusual definition) at the end of his first year in business.
Curio type i costs C_i (1 <= C_i <= 100,000) money to purchase and yields R_i (1 <= R_i <= 100,000) revenue for each curio sold (a profit of R_i-C_i). FJ can mix and match the curios he sells in any way he wishes. He need not spend all his money when purchasing curios.
What is the greatest amount of total profit () FJ can have at the end of his first year? This number is guaranteed to be less than 1,000,000,000.
Consider the situation when FJ has just 3 kinds of curios and starts with M=17. Below are the cost and revenue numbers for each curio:               Curio     Cost     Revenue                #        C_i       R_i                1         2         4                2         5         6                3         3         7 In this case, FJ should purchase 5 curios of type 3 for 15 money and 1 more curio of type 1 for 2 money, a total of 17 money. His profit will be 5 * (7-3) + 1 * (4-2) = 5*4 + 1*2 = 22 money. He can do no better than this given the cost and revenue structure. 
NOTE: The second test case is challenging -- but our answer is correct.

输入描述

* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: Line i+1 contains two space-separated integers: C_i and R_i

输出描述

* Line 1: The maximum profit FJ can generate given the costs and revenues

示例1

输入:

3 17 
2 4 
5 6 
3 7 

输出:

22

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 17ms, 内存消耗: 724K, 提交时间: 2020-02-26 21:17:18

#include<algorithm>
#include<cstdio>
using namespace std;
int n,m,ans,f[100003];
int main()
{
	scanf("%d%d",&n,&m);
	for(int a,b,i=1;i<=n;i++)
	{
		scanf("%d%d",&a,&b);
		for(int j=a;j<=m;j++)
		ans=max(ans,(f[j]=max(f[j],f[j-a]+b-a))+m-j);
	}
	printf("%d",ans);
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 49ms, 内存消耗: 772K, 提交时间: 2019-10-27 19:51:54

#include<bits/stdc++.h>
using namespace std;
int n,m,z,w,c,f[100007];

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>c>>w;
		for(int j=1;j<=m;j++)
			if(j-c>=0)f[j]=max(max(f[j-1]+1,f[j]),f[j-c]+w-c);
	}
	cout<<f[m]<<endl;
	return 0;
}

上一题