Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找数字和的所有变化_Algorithm_Mathematical Optimization_Digit - Fatal编程技术网

Algorithm 查找数字和的所有变化

Algorithm 查找数字和的所有变化,algorithm,mathematical-optimization,digit,Algorithm,Mathematical Optimization,Digit,有谁能告诉我一个算法/公式,它说明了如何计算具有一定上限的数字和的所有变化 例如,如果我的数字和是6,上限是123,那么这个数字和的所有变化都是: 6、15、24、33、42、51、60、105、114和123 上限可以达到10×18,程序需要在1秒内(C/CPP)中工作,所以暴力不是一个选项。 < P>我认为有一个递归的方法来解决这个问题:考虑一个过程 int f(布尔极限,int比特数,int比特和)< />它计算位和为位和的不超过位计数位的变化数。bool参数limit表示该限制(在您的示

有谁能告诉我一个算法/公式,它说明了如何计算具有一定上限的数字和的所有变化

例如,如果我的数字和是6,上限是123,那么这个数字和的所有变化都是: 6、15、24、33、42、51、60、105、114和123


上限可以达到10×18,程序需要在1秒内(C/CPP)中工作,所以暴力不是一个选项。

< P>我认为有一个递归的方法来解决这个问题:考虑一个过程<代码> int f(布尔极限,int比特数,int比特和)< />它计算位和为
位和
的不超过
位计数
位的变化数。bool参数
limit
表示该限制(在您的示例中为123)是否生效

假设
Limit[i]
表示限制的第i位

int f(bool limit, int bit_count, int bit_sum){
    if(bit_sum < 0)
        return 0;
    if(bit_count == -1)
        if(bit_sum == 0)
            return 1;
        else
            return 0;

    int ans = 0;
    for(int i = 0; i <= limit ? Limit[bit_count] : 9; i++){
        ans += f(limit && i == Limit[bit_count], bit_count - 1, bit_sum - i);
    }
    return ans;
}
intf(布尔极限、整数位计数、整数位和){
如果(位和<0)
返回0;
如果(位_计数==-1)
如果(位和=0)
返回1;
其他的
返回0;
int ans=0;

对于(int i=0;i创建一个基于DP的解决方案,以计算最多k个和为n的数字的总和

F(k,n)=和(k-1,n-i)

假设max有k个数字,最高有效位是sig(max),dropsig(max)是没有最高有效位的数字

G(k,max,n)=F(k-1,n)+G(k-1,dropsig(max),n-sig(max))+i=1到sig(max)-1的和i(k-1,n-i)

很明显,你必须处理一些角落里的案子。但这里是总结

第一个组件对应于数字长度小于最大数字长度的情况

第二个分量对应于溶液的最高有效位与最大有效位的最大有效位相同的情况


第三个组件对应于解决方案的最高有效位小于最大值的有效位,但大于或等于1的情况。

假设确实存在公式,可能需要对其中的一些进行暴力处理,然后尝试从中推导公式。祝您好运,有问题时请通知我们。这是非常有用的这是一个称为整数分区的标准问题。您需要打印所有变量还是只计算变量的数量?不过,您的“数字和”只是分区。您正在寻找一组加起来等于给定数字的数字。唯一的区别是,通常不包括零,您也需要排列(安排)。@alko:所以这是一个受限分区。同样的算法方法仍然适用。