01背包问题

来源:互联网 发布:网站域名交易流程 编辑:程序博客网 时间:2024/06/06 03:03

1、回溯法解决

// 针对N叉树的递归回溯方法

void backtrack (int t)

{

    if (t > n) {

       // 到达叶子结点,将结果输出

       output (x);

    }

    else {

       // 遍历结点t的所有子结点

       for (int i = f(n,t); i <= g(n,t); i ++ ) {

           x[t] = h[i];

           // 如果不满足剪枝条件,则继续遍历

           if (constraint (t) && bound (t)) 

              backtrack (t + 1);

       }

    }

}

代码:

#include<iostream>using namespace std;const int N=4;int c=8;  int v[]={0,2,1,4,3},w[]={0,1,4,2,3};//下标从1开始  int x[N+1]; int best[N+1];int cw=0;int cv=0;int max_v=0;//最大价值void find(int t){if(t>N){if(max_v<=cv){max_v=cv;for(int i=0;i<=N+1;i++)best[i]=x[i];}return ;}//if(cw+w[t]>c)//超重//return;if(cw+w[t]<=c)//左子树{//放x[t]=1;cw=cw+w[t];cv=cv+v[t];find(t+1);//还原x[t]=0;cw-=w[t];cv-=v[t];}//右子树find(t+1);}void main(){find(1);for(int i=0;i<=N+1;i++){if(best[i]==1)cout<<i<<endl;}cout<<endl;cout<<"max_v="<<max_v<<endl;}


0 0
原创粉丝点击