C++ 字符串二元组合学

C++ 字符串二元组合学,c++,string,binary,combinatorics,C++,String,Binary,Combinatorics,有没有一种简单的方法可以找到所有二进制字符串,假设所有的1值都是2分,所有的0值都是1分,那么这些二进制字符串的数字加起来等于x点。让我解释一下: 考虑到我收到了一个数字5,我如何才能得到所有可能的字符串,使得2*(一的数字)+1*零=5。 5年的所有结果如下: 00000 一万 0100 0010 0001 101 110 011 (我知道可能解的数目是5+1(x+1)的斐波那契数,但我想不出一种方法来找到所有的值) 我在考虑用二进制或是用一个基转换器来增加数字,但我可能在这里遗漏了一些东西。

有没有一种简单的方法可以找到所有二进制字符串,假设所有的1值都是2分,所有的0值都是1分,那么这些二进制字符串的数字加起来等于x点。让我解释一下:

考虑到我收到了一个数字5,我如何才能得到所有可能的字符串,使得2*(一的数字)+1*零=5。 5年的所有结果如下:

00000

一万

0100

0010

0001

101

110

011

(我知道可能解的数目是5+1(x+1)的斐波那契数,但我想不出一种方法来找到所有的值)


我在考虑用二进制或是用一个基转换器来增加数字,但我可能在这里遗漏了一些东西。提前感谢。

通过单个循环,您可以生成基本字符串(在您的示例中为“00000”、“0001”和“011”),然后使用
std::next_permutation()

试试这样的事情:

#include <iostream>
#include <string>
#include <vector>

void getSums(int sum, std::vector<std::string>& results, std::string currSum) {
    if (0 == sum) {
        results.emplace_back(currSum.c_str());
        return;
    } else if (sum < 0) {
        return;
    } else {
        getSums(sum-2, results, currSum+"1");
        getSums(sum-1, results, currSum+"0");
    }
}

std::vector<std::string> getAllSums(int sum) {
    std::vector<std::string> results;
    std::string currSum;
    getSums(sum, results, currSum);
    return results;
}

int main() {
    std::vector<std::string> res = getAllSums(5);
    for (std::string& r : res) {
        std::cout << r << std::endl;
    }

}
#包括
#包括
#包括
void getSums(int-sum,std::vector&results,std::string currSum){
如果(0==总和){
结果:安置背部(currSum.c_str());
返回;
}else if(总和<0){
返回;
}否则{
getSums(sum-2,结果,currSum+“1”);
getSums(sum-1,结果,currSum+“0”);
}
}
标准::向量getAllSums(整数和){
std::矢量结果;
std::字符串currSum;
getSums(总和、结果、currSum);
返回结果;
}
int main(){
std::vector res=getAllSums(5);
for(标准::字符串&r:res){

std::不能只找到所有二进制字符串并检查它们是否满足?或者使用递归?生成带有必要的0和1的字符串很简单(在您的例子中是“00000”、“0001”和“011”),然后您可以使用
std::next_permutation
生成变量是的…有很多方法,选择一种您想要的方法。如果您仍然卡住了,请回到这里。⁺1这是一个令人惊讶的简单和简洁的解决方案。@Jarod42抱歉,我在这里修复了bug,但不是在ideone上,它应该是
zeros>=0
,更新了
#include <iostream>
#include <string>
#include <vector>

void getSums(int sum, std::vector<std::string>& results, std::string currSum) {
    if (0 == sum) {
        results.emplace_back(currSum.c_str());
        return;
    } else if (sum < 0) {
        return;
    } else {
        getSums(sum-2, results, currSum+"1");
        getSums(sum-1, results, currSum+"0");
    }
}

std::vector<std::string> getAllSums(int sum) {
    std::vector<std::string> results;
    std::string currSum;
    getSums(sum, results, currSum);
    return results;
}

int main() {
    std::vector<std::string> res = getAllSums(5);
    for (std::string& r : res) {
        std::cout << r << std::endl;
    }

}