給定一串數字,找到字符串等於某個目標數所需的最小添加數。每個添加都等價於在數字串的某個位置插入加號。快速遞歸遞歸得不到適當的結果
例如: 「1110」
目標3
返回3爲1 + 1 + 1 + 0 = 3需要3次加法。
「」
目標45
返回:8
「99999」
靶100
返回:-1
「382834」
返回:2
有3種方法得到100它們是38 + 28 + 34,3 + 8 + 2 + 83 + 4和3 + 82 + 8 + 3 + 4。最低要求是2.
我試過這個問題,這裏是我的代碼。我第一次考慮一個角色並獲得結果。下一次我使用2個字符並獲得結果等等,直到我嘗試所有字符的字符串的大小。我沒有得到正確的遞歸。
int min(int a,int b)
{
return a>b?b:a;
}
/* i is current index we are considering and sum is total number
*of + required
*/
int foo(char *a, int size, int i, int current_stock, int target, int sum){
unsigned long long int mini = 1 << 30; /* huge number */
int number=0, mul, m;
int p = i;
if (i+current_stock>size)
return mini;
if (target == 0)
return sum;
if (target < 0)
return mini;
mul = 1;
/* make the multiplier */
for (m=1;m<current_stock;m++) {
mul *= 10;
}
/* make the number from i to current_stock
* if the string is 123 and if i is 0 and current_stock is 2
* then the number will be 12 */
for (m=0;m<current_stock;m++) {
number += (a[p]-'0')*mul;
mul = mul/10;
p++;
}
sum = sum + 1;
for(m=current_stock;m<=size;m++) {
mini = min(mini, foo (a, size, i+current_stock, m, target-number, sum));
}
return mini;
}
int main(void) {
char a[] = "382834";
printf("%d", foo(a, strlen(a), -1, 1, 100, 0));
printf("%d\n", strlen(a));
return 0;
}
您的解決方案與我的幾乎相似,所以我將此標記爲正確的解決方案。 Gene發佈的解決方案非常完美,但由於您的解決方案與我的解決方案類似,因此我將其標記爲正確答案 – 2015-04-06 05:56:52
@newbie_old謝謝。順便說一句,這是一個騙子(或任何其他網上法官)的問題?如果有,請分享鏈接嗎? – Naman 2015-04-06 21:50:28
http://community.topcoder.com/stat?c=problem_statement&pm=2829&rd=5072 – 2015-04-06 23:27:57