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