Java 最大库存(贪婪法)

Java 最大库存(贪婪法),java,Java,在股票市场中,有一种产品拥有无限的股票。股票价格为n天,其中arr[i]表示第i天的股票价格。有一条规定,客户最多可以在第i天购买i股。如果客户一开始有k美元,找出他们可以购买的股票的最大数量?例如,对于3天,股票价格分别为7美元、10美元、4美元。您可以在第一天购买1只价值7美元的股票,在第二天购买2只价值10美元的股票,在第三天购买3只价值4美元的股票。如果k=100美元,你可以用39美元购买所有股票(总共6只)$ 约束 1.1考虑到你知道“未来”价格,你需要对股票进行分类,然后首先购买最便

在股票市场中,有一种产品拥有无限的股票。股票价格为n天,其中arr[i]表示第i天的股票价格。有一条规定,客户最多可以在第i天购买i股。如果客户一开始有k美元,找出他们可以购买的股票的最大数量?例如,对于3天,股票价格分别为7美元、10美元、4美元。您可以在第一天购买1只价值7美元的股票,在第二天购买2只价值10美元的股票,在第三天购买3只价值4美元的股票。如果k=100美元,你可以用39美元购买所有股票(总共6只)$

约束

1.1考虑到你知道“未来”价格,你需要对股票进行分类,然后首先购买最便宜的股票

编辑
你知道所有股票的价格和数量,你不必按顺序购买。这就像手里拿着20美元走进商店,目标是买尽可能多的啤酒。7美元一杯有1杯,8美元一杯有2杯,3美元一杯有3杯,1美元一杯有4杯(假设所有的啤酒都是一样的)。在任何情况下,选择更贵的瓶子而不是更便宜的瓶子都是明智的,所以你开始从最便宜的瓶子购买

让我们把它应用到我们的问题上。给定输入

4
7 8 3 1
20
我们有很多存货

{7, 8, 8, 3, 3, 3, 1, 1, 1, 1}
您的解决方案将以7美元的价格购买1支股票,以8美元的价格购买1支股票,但它将停在那里,因为它买不起第二支8美元的股票。
但是如果我们对该数组进行排序会发生什么呢?
结果将是

{1, 1, 1, 1, 3, 3, 3, 7, 8, 8}
现在我们可以贪婪地买了!8只股票的总价值为20美元,而不是2只股票的总价值为15美元。算法很简单:如果你买得起下一只股票,你就买它,然后增加一个计数器。如果不是,则打印计数器

代码内容

导入java.util.array//包含排序函数
公营股票买家{
公共静态void main(字符串[]args){
//在这里,您应该解析输入,我将把它留给您和
//使用上面示例中的值
int arr[]={7,8,8,3,3,3,1,1,1,1};
int moneytospend=20;
int=0;
//排序数组
数组。排序(arr);
对于(int i=0;i=arr[i];i++){
moneytospend-=arr[i];
购买++;
}
系统输出打印项次(购买);
}
}
摘要

D M已经向您展示了您的编码错误,我希望我能够向您解释您的算法错误的原因。

仅供参考:有更聪明(结果更快)的方法在排序前准备数据。例如,您可以对一组对{value,quantity}进行排序,我将把它放在这里,让您来计算其余的;)快乐编码

您在
buyMaximumProducts
中的逻辑有点偏离。即使尝试没有得到最佳解决方案,这也是错误的

您的
if
语句似乎问题最多。例如:

if ((k%a[i])>=(i+1))
这里使用模运算符没有意义。这会给你带来毫无意义的结果;在某些情况下,结果是当你甚至没有足够的钱购买股票时,它就会购买股票。让我们将
%
更改为
/

if(k/a[i]==0)
这永远不会是真的。我们已经知道,
k>=a[i]
,因为我们在
if
语句中,所以这不可能是0。如果它是0,那就意味着你没有足够的钱买股票

else if(k%a[i]!=0)
再次使用模运算符,这仍然没有意义。使用除法

或者更好的是,甚至不用除法。整个条件是不必要的。我们已经知道(在修正了第一段代码之后,
k/a[i]
小于
i+1
,这意味着我们可以随心所欲地购买任意数量的股票,直到我们的钱用完为止。所以我们可以使用
numofstocks=numofstocks+(k/a[i]);商=k/a[i]
else
块中

因此,
if
逻辑简化为:

    if (k >= a[i])  //still can buy at least one
    {   
        if ((k / a[i]) >= (i+1))
        {
            numofstocks = numofstocks + i + 1;
            quotient=i+1;
        }
        else
        {
            numofstocks = numofstocks + (k / a[i]);
            quotient=k/a[i];
        }
    }
但是等等,还有一个错误。如果条件
如果(k>=a[i])
为假,则表示您没有足够的钱购买股票。但直线
k=k-(a[i]*商)仍然会被执行,使得算法认为即使什么都没买,它也在花钱。所以你可以把
k=k-(a[i]*商)if
语句中添加code>,或包含一个
else
语句,该语句将
商设置为0,而不是将其保留为以前的任何值


当然,一旦你做了所有这些,它仍然是不正确的。它将尽可能快地花掉所有的钱,这不是最优的。它需要先做最便宜的几天。

代码中最重要的部分是使用排序函数

#!/bin/python
import sys

def buyMaximumProducts(n, k, a):
    # Complete this function
    stocks = sorted(enumerate(a, start=1), key=lambda arr: arr[1])
    maxStock = 0
    for stock in stocks:
        count, _ = divmod(k, stock[1])
        if count > 0:
            if count >= stock[0]:
                count = stock[0]
            maxStock += count
            k -= stock[1] * count
        else:
            return maxStock
    return maxStock

if __name__ == "__main__":
    n = int(raw_input().strip())
    arr = map(int, raw_input().strip().split(' '))
    k = long(raw_input().strip())
    result = buyMaximumProducts(n, k, arr)
    print result

如果我的回答帮助您解决了问题,请单击左侧的勾号,将其标记为已接受。这将使社区更容易浏览未回复的页面
    if (k >= a[i])  //still can buy at least one
    {   
        if ((k / a[i]) >= (i+1))
        {
            numofstocks = numofstocks + i + 1;
            quotient=i+1;
        }
        else
        {
            numofstocks = numofstocks + (k / a[i]);
            quotient=k/a[i];
        }
    }
#!/bin/python
import sys

def buyMaximumProducts(n, k, a):
    # Complete this function
    stocks = sorted(enumerate(a, start=1), key=lambda arr: arr[1])
    maxStock = 0
    for stock in stocks:
        count, _ = divmod(k, stock[1])
        if count > 0:
            if count >= stock[0]:
                count = stock[0]
            maxStock += count
            k -= stock[1] * count
        else:
            return maxStock
    return maxStock

if __name__ == "__main__":
    n = int(raw_input().strip())
    arr = map(int, raw_input().strip().split(' '))
    k = long(raw_input().strip())
    result = buyMaximumProducts(n, k, arr)
    print result