求解01背包问题(深搜)noj

    科技2026-04-10  8

    问题1:装入背包中物品重量和恰好为W

    #include<stdio.h> #define MAXN 20 int W=6; int n=4;//4种物品 int w[]={0,5,3,2,1}; int v[]={0,4,4,3,1}; int X[MAXN]; int max=0; void dfs(int i,int tw,int tv,int *op); void Output(); int main() { int op[MAXN]; dfs(1,0,0,op); Output(); return 0; } void dfs(int i,int tw,int tv,int *op) { int j; if(i>n){ if(tw==W&&tv>max){ max=tv; 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; dfs(i+1,tw,tv,op); } } void Output() { int i; int s=0; printf("最佳方案:"); for(i=1;i<=n;i++){ if(X[i]!=0){ s=s+v[i]; printf("%d ",i); } } printf("\n对应物品总价值:%d",s); }

    优化升级1: 增添限界条件: (对于重量超过W的不再进行选择操作)

    void dfs(int i,int tw,int tv,int *op)

    优化升级2: 增添限界条件: (对于重量不可能超过W的进行排除操作)

    #include<stdio.h> #define MAXN 20 int W=6; int n=4;//4种物品 int w[]={0,5,3,2,1}; int v[]={0,4,4,3,1}; int X[MAXN]; int max=0; void dfs(int i,int tw,int tv,int rw,int *op); void Output(); int main() { int op[MAXN]; dfs(1,0,0,11,op); Output(); return 0; } void dfs(int i,int tw,int tv,int rw,int *op) { int j; if(i>n){ if(tw==W&&tv>max){ max=tv; for(j=1;j<=n;j++) X[j]=op[j]; } } else{ if(tw+w[i]<=W){ op[i]=1; dfs(i+1,tw+w[i],tv+v[i],rw-w[i],op); } if(tw+rw-w[i]>=W){ op[i]=0; dfs(i+1,tw,tv,rw-w[i],op); } } } void Output() { int i; int s=0; printf("最佳方案:"); for(i=1;i<=n;i++){ if(X[i]!=0){ s=s+v[i]; printf("%d ",i); } } printf("\n对应物品总价值:%d",s); }

    问题2:装入背包中物品重量和不超过W

    #include<stdio.h> #include<malloc.h> #define MAXN 20 typedef struct node { int no;//物品编号 int w;//重量 int v;//价值 int p;//单位重量价值 }Node; int n=4; int W=6; //w[]={0,5,3,2,1}; //int v[]={0,4,4,3,1}; int X[MAXN]; int max=0; void dfs(Node *A,int i,int tw,int tv,int *op); int bound(Node *A,int i,int tw,int tv); void Output(Node *A); int main() { Node A[MAXN]; //Node *p=A; int op[MAXN]; int i; //p=(Node*)malloc(sizeof(Node)*(MAXN-1)); printf("请输入物品的重量:\n"); for(i=1;i<=n;i++){ A[i].no=i; scanf("%d",&A[i].w); } printf("请输入物品对应的价值:\n"); for(i=1;i<=n;i++){ scanf("%d",&A[i].v); } dfs(A,1,0,0,op); Output(A); return 0; } void Output(Node *A) { int i; int s=0; printf("最佳方案:"); for(i=1;i<=n;i++){ if(X[i]!=0){ s=s+A[i].v; printf("%d ",i); } } printf("\n对应物品总价值:%d",s); } void dfs(Node *A,int i,int tw,int tv,int *op) { int j; if(i>n){ if(tv>max){ max=tv; for(j=1;j<=n;j++){ X[j]=op[j]; } } else return; } else{ if(tw+A[i].w<=W){ op[i]=1; dfs(A,i+1,tw+A[i].w,tv+A[i].v,op); } if(bound(A,i,tw,tv)>max){ op[i]=0; dfs(A,i+1,tw,tv,op); } } } int bound(Node *A,int i,int tw,int tv) { i++; while(i<=n&&tw+A[i].w<=W){ tw=tw+A[i].w; tv=tv+A[i].v; i++; } if(i<=n)return tv+(W-tw)*A[i].p; else return tv; }

    #include<stdio.h > #define MAXSIZE 20 int n;//n个物品 int c;//背包的容量为c int w[MAXSIZE];//物品的重量 int p[MAXSIZE];//物品的价值 int x[MAXSIZE]; int max; int maxn[MAXSIZE]; void input1(); void input2(); void dfs(int i,int wi,int pi,int *op); int main() { int op[MAXSIZE]; int i,j; scanf("%d %d",&n,&c); for(i=0; ;i++){ if(n==0&&c==0)break; if(n==0){ scanf("%d %d",&n,&c); i++; maxn[i]=0; break; } input1();//输入物品的重量 input2();//输入物品的价值 dfs(0,0,0,op); maxn[i]=max; scanf("%d %d",&n,&c); } for(j=0;j<i;j++){ printf("%d\n",maxn[j]); } return 0; } //输入物品的重量 void input1() { int i; for(i=0;i<n;i++) scanf("%d",&w[i]); } //输入物品的价值 void input2() { int i; for(i=0;i<n;i++) scanf("%d",&p[i]); } void dfs(int i,int wi,int pi,int *op) { if(i>n-1){ if(wi<=c&&pi>=max){ max=pi+p[i]; } } else{ op[i]=1; dfs(i+1,wi+w[i],pi+p[i],op); op[i]=0; dfs(i+1,wi,pi,op); } } #include<iostream> #include<string.h> #define MAXN 100 #define true 1 #define false 0 using namespace std; int c;//容量为c的背包 int n;//从n个物品中选取装入背包的物品 int w[MAXN];//每件物品i的重量为wi int p[MAXN];//价值为pi int maxw[MAXN]; int maxm; void dfs(int *op,int i,int wi,int pi); int main() { int i,j=1,k; int op[MAXN]; memset(op,0,sizeof(op)); while(1){ cin>>n>>c; if(n==0){ if(c==0)break; else { maxw[j]=0; j++; continue; } } for(i=1;i<=n;i++){ cin>>w[i]; } for(i=1;i<=n;i++){ cin>>p[i]; } dfs(op,1,0,0); maxw[j]=maxm; j++; } for(k=1;k<j;k++)cout<<maxw[k]<<endl; return 0; } void dfs(int *op,int i,int wi,int pi) { if(i>n){ if(pi>maxm&&wi<=c){ maxm=pi; } } else{ op[i]=1; dfs(op,i+1,wi+w[i],pi+p[i]); op[i]=0; dfs(op,i+1,wi,pi); } }

    在if(i>n) 中,maxm=pi;与maxm=pi+p[i];都可以,因为此时的p[i]=0。

    Processed: 0.011, SQL: 9