添加整数但选择最接近我想要的数字

时间:2015-12-15 17:50:47

标签: java algorithm

我坐在这里试图完成这项任务 (https://open.kattis.com/problems/walrusweights

  

第一个输入包含我应该使用的印版数量(整数)   后面的内容是板(重量),它们中的每一个应该<= 1000   添加整体,尽量接近1000,但是   如果有两个这样的数字同样接近1000,(998和1002),那么选择更大的数字。

假设我有4个盘子,第一个是4,900,500,498 添加它们,以便尽可能接近1000。 498 + 500 = 998 500 + 498 + 4 = 1002 在这种情况下,请选择1002。

int sum=0;
 Scanner scan = new Scanner(System.in);
 int count = scan.next();
 for(int i = 0; i < count; i++)
 {
   sum = sum + scan.next();
 }

Scanner scan = new Scanner(System.in);
int count = scan.nextInt();

while(count > 0) {
//your logic
count--;
}

我已经尝试但不了解如何比较添加的数字的逻辑/算法,如果它们相等,请选择更大的数字。 我得到的只是我可以放入计数器和权重,它会加起来,有人可以解释如何制作算法吗?我应该阅读什么来理解这一点?

谢谢。

2 个答案:

答案 0 :(得分:2)

这是一个动态编程问题,如果您不熟悉这种方法,这是Google的第一件事。此任务的想法是创建一个大小为2001的数组A(请注意,任何可能的答案都小于或等于2000)。最初,A[0] = true和所有其他索引A[i] = false。然后,对于每个板块,您将从1000向下迭代到0,如果A[i] == true则为A[i + currentWeight] = true。通过这种方式,您可以计算出可以使用印版获得的总重量。最后,您会找到索引x,以使A[x] == true(x - 1000)尽可能小(如果是抽奖,则会占用最大的x)。

答案 1 :(得分:2)

正如@Ardavel建议的那样,这称为动态编程 一个着名的问题是Knapsack问题,另一个是 Dijkstra 的最短路径问题算法。

这种方法背后的基本思想是打破子任务并存储子结果。 您解决每个子任务一次并将其解决方案存储在查找中 下次出现相同的子问题时,不使用重新计算其解决方案,而是使用查找并节省时间和内存。
在您的情况下,您将子元素与类背包问题相似。