• 01背包问题的非递归解


    0-1背包问题:求:从1,2,3,。。。n中取若干个数,使和为m,输出所有序列的非递归算法,其中,m>n

    void print(vector<int> &v){  
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
    cout
    <<*it<<" ";
    }
    cout
    <<endl;
    }
    void algorithm(int m,int n){
    vector
    <int> p;//记录Path
    int i=n;
    int j=n;
    int temp_m=m;
    p.reserve(
    10);
    while(i*(1+i)/2>=m){
    p.clear();
    j
    =i;
    temp_m
    =m;
    while(true){
    if(j==0)
    break;
    if(temp_m-j>0){
    p.push_back(j);
    temp_m
    -=j;
    j
    --;
    }
    else if(temp_m-j<0){
    j
    --;
    }
    else{
    p.push_back(j);
    print(p);
    if(p.size()>0&&p[p.size()-1]!=1){
    p.pop_back();
    j
    --;
    continue;
    }
    else{
    break;
    }
    }
    }
    i
    --;
    }
    }
    int main(){
    algorithm(
    10,7);
    }

    
    
  • 相关阅读:
    C语言预处理
    C语言结构体对齐
    C语言共用体、大小端、枚举
    C语言内存分配方法。
    C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
    C语言中函数的传入值与传出值
    #define与typedef在重定义类型中的区别
    宏定义在位运算中的运用
    wait函数
    exit()与_exit()区别
  • 原文地址:https://www.cnblogs.com/CUCmehp/p/1314148.html
Copyright © 2020-2023  润新知