如何找到一个等于和

时间:2018-03-02 07:08:09

标签: c++ algorithm c++11 c++14

我遇到来自hackerearth的this问题

  

给定N个整数,C卡和S和的数组。每张卡都可以使用   将给定数组中的整数递增或递减1。   查找是否有任何子集(在使用任何no.of卡之前/之前)   给定数组中的和S.

     

输入格式

     

第一行输入包含一个表示no的整数T.的   测试用例。每个测试用例有2行输入。各自的第一行   测试用例有三个整数N(数组的大小),S(子集和)和   C(卡号)。每个测试用例的第二行有N个整数   数组(a1到aN)由空格分隔。

     

约束

     

1 <= T <= 100 <1 <= N <= 100 <1 <= S <= 10000左右0 <= C <= 100 <1 <= AI&LT; = 100

     

输出格式

     

如果存在具有给定总和的子集,则打印为TRUE,否则打印为FALSE。

所以这基本上是子集求和问题的变体,但是我们需要找到序列S到{的最大子集,而不是找出具有和index的给定子集。 {1}}的值为N-1,并将其长度与我们的s值进行比较,看它是否更大。如果是,那么我们有足够的元素来使用我们的C卡来修改总和,然后我们打印出我们的答案。这是我的代码

C

所以基本上,0表示不可能从元素索引到N-1创建一个等于s的子集,-1表示我们还没有计算它。并且任何其他值表示总计为s的最大子集的大小。此代码未通过所有测试用例。怎么了?

2 个答案:

答案 0 :(得分:1)

您错过了以下一行中的else

} if (newSum > 0) {

这使得您的程序在某些情况下maxNums更新l之前会出现意外的早期休息。

例如,N = 1,S = 5,C = 0,a = {5}

潜在的逻辑问题

你限制了号码。用于不超过子集大小的卡,而问题从不说明您不能将多张卡应用于相同的整数。

我的意思是l >= im >= i

if ( (l > 0 && l >= i) || (m > 0 && m >= i) ) {

答案 1 :(得分:0)

似乎你有逻辑缺陷。

您需要找到最短子集(范围为S-C..S+C的和)并将其大小与C进行比较。如果子集较短,则可以进行所需的求和。