Algorithm --> 投资组和求最大利润

投资组和求最大利润

题目:

  投资人出资一笔费用mount,投资给不同的公司(A,B,C....),求最大获取利润?

例如:投资400百万,给出两家公司A和B:

  1.如果投资一百万给A公司,投资3百万给B工资,则获取14百万(5百万+9百万);

  2.如果都投资给B公司,则获取15百万,所以应该投资给B公司;

故选择全部投给B公司。


Invested Amount(Unit: KRW 100 million won)


Company A


Company B


1


5


1


2


6


5


3


7


9


4


8


15

条件:

1、给出投资额mount,以及公司个数comp

2、投给同一家公司的金额不能拆分,比如,有4百万投资额,投给A公司1百万和3百万(不允许)

代码:

/*
思路分析:
1,01背包问题,最早尝试把所有的点转换为 (公司数*投资数)个物品,进行简单的二重循环的背包问题,但是题意有说明,同一家
公司的投资不能分开,也就是这些物品之间有了排斥关系;
2,转换思路为,F[N][V]代表在前N家公司投资的总利益,应为投给了第N家和没有投给第N家两种情况的最大值;
F[N][V] = MAX{F[N-1][V], F[N-1][?]+?};
关键是这里投给第N家公司的最大利益需要一一遍历它的所有可能的投资数,然后得到max值,再代入上式进行比较即可。

        int max = -1;
        for(int k = 1; k <= Mount; k++)
            if(j - k >= 0)
                max = MAX(max, dp[j-k] + invest[k][i]);
*/

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int invest[301][21];
int Mount, Comp;
int dp[301];

int main(int argc, char** argv)
{
    int tc, T;

    //freopen("input_businessinvestment.txt", "r", stdin);

    cin >> T;
    for(tc = 0; tc < T; tc++)
    {
        cin >> Mount >> Comp;

        memset(dp, 0, sizeof(dp));

        for(int i = 1; i <= Mount; i++)
            for(int j = 0; j <= Comp; j++)
                cin >> invest[i][j];

        for(int i = 1; i <= Comp; i++)
            for(int j = Mount; j >= 1; j--) {
                int max = -1;
                for(int k = 1; k <= Mount; k++)
                    if(j - k >= 0)
                        max = MAX(max, dp[j-k] + invest[k][i]);
                dp[j] = MAX(max, dp[j]);
            }

            cout << dp[Mount] << endl;
    }

    return 0;
}

输入文件:

5
4 2
1 3 3
2 4 4
3 7 6
4 8 8
7 2
1 3 3
2 4 4
3 7 6
4 8 8
5 10 10
6 13 13
7 15 15
5 3
1 4 4 3
2 6 7 6
3 8 8 9
4 13 13 13
5 15 14 15
10 3
1 4 4 3
2 6 7 6
3 8 8 9
4 13 13 13
5 15 14 15
6 19 18 19
7 20 20 20
8 23 25 23
9 27 27 26
10 31 31 31
5 5
1 3 4 6 2 6
2 11 10 10 9 11
3 12 12 13 14 13
4 18 17 19 19 18
5 23 26 24 25 24

时间: 2024-11-04 23:32:39

Algorithm --> 投资组和求最大利润的相关文章

牛客网 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-低年级组)求最大值

题目描述 给出一个序列,你的任务是求序列中 (a[j]-a[i])/(j-i)[1<=i<j<=n]的最大值 输入描述: 本题包含多组输入,每组输入第一行一个数字n,表示序列的长度.然后接下来一行输入n个数,表示原先序列的样子.数据范围:3<=n<=200000-1000000000<=a[i]<=1000000000 输出描述: 每组数据输出一行一个浮点数,保留两位小数,表示所求的最大值. 示例1 输入 5 2 4 6 8 10 输出 2.00 备注: 输入只有

树状树组离散化求逆序对模板

#include <iostream> #include <cstring> #include <stack> #include <cstdio> #include <cmath> #include <queue> #include <algorithm> #include <vector> #include <set> #include <map> using namespace st

POJ 2761 Feed the dogs(树状数组求区间第K大)

题目链接: 戳我 题目大意:Jiajia要为宠物狗,宠物狗按成一排站好(1 < i <= n),第 i 只狗的喜欢程度是 a[i], 之后他会先喂某个区间内第k个 即 n 个数, m个询问,接着是 n个数 接下来 m 行,每行是 l r k即 l 到 r 这个区间第 k 小的数,每个询问输出一个答案,即 a[i] 求区间第k大有很多算法, 详见此博客 [数据结构练习] 求区间第K大数的几种方法 我用的树状数组解法,来自 树状数组从前往后求和,用来解第k大(或小)的数 poj 2985 The

连续子数组的和的最大值、最小值以及和的绝对值的最大值、最小值

#include <iostream> #include <vector> #include <algorithm> using namespace std; //求子数组的最小和 //利用的是dp的思想,依次遍历数组中的每个元素,把他们相加,如果加起来大于0,则 //把当前元素之和清为0,否则则和最小和比较,更新最小和,最后得到必是子数组的最小和 //时间复杂度:o(n) 空间复杂度:o(1) int minSum(vector<int> &num

poj 2985 The k-th Largest Group 求第K大数 Treap, Binary Index Tree, Segment Tree

题目链接:点击打开链接 题意:有两种操作,合并集合,查询第K大集合的元素个数.(总操作次数为2*10^5) 解法: 1.Treap 2.树状数组 |-二分找第K大数 |-二进制思想,逼近第K大数 3.线段树 4.... Treap模板(静态数组) #include <math.h> #include <time.h> #include <stdio.h> #include <limits.h> #include <stdlib.h> const

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

P4177 [CEOI2008]order

P4177 [CEOI2008]order 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 输入输出格式 输入格式: 第一行给出 N,M(1<=N<=1200,1<=M<=1200) 下面将有N组数据. 每组数据第一行给出完成这个任务能赚到的钱(其在[1,5000])及有多少道工序 接下来若干行每行两个数,分别描述完成工序所需要的机器编号及租用它的费用(

PAT Basic 1020 ?饼 (25) [贪?算法]

题目 ?饼是中国?在中秋佳节时吃的?种传统?品,不同地区有许多不同?味的?饼.现给定所有种类?饼的库存量.总售价.以及市场的最?需求量,请你计算可以获得的最?收益是多少. 注意:销售时允许取出?部分库存.样例给出的情形是这样的:假如我们有3种?饼,其库存量分别为18.15.10万吨,总售价分别为75.72.45亿元.如果市场的最?需求量只有20万吨,那么我们最?收益策略应该是卖出全部15万吨第2种?饼.以及5万吨第3种?饼,获得 72 + 45/2 = 94.5(亿元). 输?格式: 每个输?包

BZOJ 1821 JSOI 2010 Group 部落划分 Group Kruskal

题目大意:给出平面上的一些点,现在要把这些点分成k组,求每组之间的距离的最小值的最大值. 思路:很水的题,只需要做一次最小生成树 ,然后去掉k-1条边,第k-2条边就是答案. CODE: #include <cmath> #include <cstdio> #include <iomanip> #include <cstring> #include <iostream> #include <algorithm> #define MAX