求解01背包问题 回溯法

    科技2022-07-10  107

    求解0/1背包问题 无剪枝算法


    #include<stdio.h> #define MAXN 20//最多物品数 int n,W,k; int w[MAXN],v[MAXN]; int x[MAXN];//存放最终解 int maxv=0; void dfs(int i,int tw,int tv,int op[]) { if(i>n) { if(tw==W&&tv>maxv) { maxv=tv; int j; for(j=1;j<=n;j++) x[j]=op[j]; } } else { op[i]=1; dfs(i+1,tw+w[i],tv+v[i],op); op[i]=0;//不选择第i个物品,回溯 dfs(i+1,tw,tv,op); } } int main() { int op[MAXN];//存放临时解 scanf("%d",&n);//物品数量 scanf("%d",&W);//限制重量 for(k=1;k<=n;k++) { scanf("%d",&w[k]);//分别存放物品的重量 } for(k=1;k<=n;k++) { scanf("%d",&v[k]);//分别存放物品的价值 } dfs(1,0,0,op); printf("%d",maxv); return 0; }

    求解0/1背包问题及左剪枝 回溯法

    求解0/1背包问题及左右剪枝 回溯法

    Processed: 0.014, SQL: 8