0-1背包问题 亦凉 2022-08-08 13:59 156阅读 0赞 有n个物体,重量和价值已知,要放入容量为c的背包里,放入的时间,要求放入的总重量不能超过包的容量,同时保证价值最大。 动态规划: #include <stdio.h> #define min(a,b) a>b?b:a #define max(a,b) a>b?a:b int main() { int n,c; int *w, *v,*flag; //w代表每个物品的容积,v代表价值, flag代表是否出现 int **m; //m[i,j]用来存储当剩余容量为j时,可选择的物品为i,i+1,...时,0-1背包问题的最优值 int i,j,k; int jMax; printf("please input the number of things and the volume of the knap:"); scanf("%d %d",&n,&c); w=new int [n]; v=new int [n]; flag=new int [n]; m=new int *[n]; for(i=0;i<n;i++) m[i]=new int [c+1]; printf("input the volume of each thing:"); for(i=0;i<n;i++) scanf("%d", &w[i]); printf("input the value of each thing:"); for(i=0;i<n;i++) scanf("%d",&v[i]); //从最后一个元素倒着推导,即第n-1个元素 jMax=min(w[n-1]-1,c); for(j=0;j<=jMax;j++) m[n-1][j]=0; for(j=w[n-1];j<=c;j++) m[n-1][j]=v[n-1]; for(i=n-2;i>0;i--) { jMax=min(w[i]-1,c); for(j=0;j<jMax;j++) m[i][j]=m[i+1][j]; for(j=jMax;j<=c;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]); } m[0][c]=m[1][c]; if(c>=w[0]) m[0][c]=max(m[1][c],m[1][c-w[0]]+v[0]); printf("the max value is %d. and the concrete are:\n",m[0][c]); for(i=0;i<n-1;i++) { if(m[i][c]==m[i+1][c]) flag[i]=0; else { flag[i]=1; c=c-w[i]; } flag[n-1]=(m[n-1][c])?1:0; } for(i=0;i<n;i++) if (flag[i]) printf("%d ",v[i]); printf("\n"); return 0; } 回溯法: #include<stdio.h> int*w,*v,weigt,n,sumW,bestV,tempV; void backtrack(int t) { if(sumW<=weigt) { int i; if(t>n) { for(i=0;i<n;i++) { if(tempV>bestV) bestV=tempV; } }else { sumW+=w[t]; tempV+=v[t]; backtrack(t+1); sumW-=w[t]; tempV-=v[t]; backtrack(t+1); } } } int main() { int i; printf("Please enter the space of the backpack:"); scanf("%d",&weigt); printf("Please input the number of objects:"); scanf("%d",&n); w=new int[n]; v=new int[n]; printf("Please input the weigt of each object:\n"); for(i=0;i<n;i++) scanf("%d",w+i); printf("Please input the value of each object:\n"); for(i=0;i<n;i++) scanf("%d",&v[i]); sumW=0; tempV=0; bestV=0; backtrack(0); printf("%d\n",bestV); return 0; } 分支限界法: #include <stdio.h> #include <stdlib.h> typedef struct QNode{ int value; //当前结点的总价值 int weight; //当前的总重量 struct QNode *next; }QNode, *QueuePtr; typedef struct{ QueuePtr front; QueuePtr rear; }Queue; int initQueue(Queue &Q){ Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) return -1; Q.front->next=NULL; return 1; } int emptyQueue(Queue Q){ if (Q.front==Q.rear) return 1; else return 0; } int destroyQueue(Queue &Q){ while(Q.front){ Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } return 1; } int enQueue(Queue &Q, int value, int weight){ QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p) <span style="white-space:pre"> </span>return -1; p->value=value; p->weight=weight; p->next=NULL; Q.rear->next=p; Q.rear=p; return 1; } int deQueue(Queue &Q, int &value, int &weight){ QueuePtr p; if(Q.front==Q.rear) return -1; p=Q.front->next; value=p->value; weight=p->weight; Q.front->next=p->next; if(Q.rear==p) <span style="white-space:pre"> </span>Q.rear=Q.front; free(p); return 1; } Queue loadingQueue; int bestvalue, n; void inQueue(int value, int weight, int i) { if(i==n-1){ <span style="white-space:pre"> </span>if(value>bestvalue) bestvalue=value; } else enQueue(loadingQueue,value,weight); } int main(){ int i,j,k; int *w, *v, ew, ev; int c; printf("input the number of things and the volume of ships:"); scanf("%d%d",&n,&c); w=new int[n]; v=new int[n]; printf("input the weights:"); for(i=0;i<n;i++) scanf("%d",&w[i]); printf("input the values:"); for(i=0;i<n;i++) scanf("%d",&v[i]); initQueue(loadingQueue); enQueue(loadingQueue,-1,0); i=0; //层数 ew=0; //扩展结点对应的载重量 ev=0; while(true){ if(ew+w[i]<=c) inQueue(ev+v[i],ew+w[i],i); inQueue(ev,ew,i); deQueue(loadingQueue, ev,ew); if(ev==-1) //同层结点尾部{ if(emptyQueue(loadingQueue)){ printf("the result is %d.\n",bestvalue); break; } enQueue(loadingQueue,-1,0); deQueue(loadingQueue, ev,ew); i++; } } <span style="white-space:pre"> </span>return 0; } 暴力搜索: #include <stdio.h> #include <math.h> int main() { int num,maxv=0; int n, c, *w, *v, tempw, tempv; int i,j,k; scanf("%d%d",&n,&c); w=new int [n]; v=new int [n]; for(i=0;i<n;i++) scanf("%d",&w[i]); for(i=0;i<n;i++) scanf("%d",&v[i]); for(num=0;num<pow(2,n);num++) //每一个num对应一个解 { k=num; tempw=tempv=0; for(i=0;i<n;i++) //n位二进制 { if(k%2==1){ //如果相应的位等于1,则代表物体放进去,如果是0,就不用放了 tempw+=w[i]; tempv+=v[i]; } k=k/2; //二进制转换的规则 } //循环结束后,一个解空间生成, //判断是否超过了背包的容积, //如果没有超,判断当前解是否比最优解更好 if(tempw<=c){ if(tempv>maxv) maxv=tempv; } } printf("%d\n",maxv); return 0; }
相关 01背包问题 [0-1背包问题][0-1] Reference: https://www.jianshu.com/p/a66d5ce49df5 问题描述: 0-1背包问题:给定 ﹏ヽ暗。殇╰゛Y/ 2022年10月11日 13:40/ 0 赞/ 252 阅读
相关 01背包问题 1.题目 有N件物品和一个容量为V的背包。第i件物品的成本是c\[i\],价值是w\[i\]。求解将哪些物品装入背包可使价值总和最大,要求是:物品只能放一次。 2.分 系统管理员/ 2022年09月10日 11:27/ 0 赞/ 216 阅读
相关 背包问题-背包01-苹果 package 动态规划.背包01; import java.util.Scanner; public class 苹果 \{ static class 野性酷女/ 2022年07月12日 12:12/ 0 赞/ 255 阅读
相关 01背包问题 ![Center][] ![Center 1][] [Center]: /images/20220616/e1a67e5ed0214bac8ec5293bc2b54 ╰+攻爆jí腚メ/ 2022年06月16日 14:46/ 0 赞/ 232 阅读
相关 01背包问题 public class package0_1 { int V[][] = new int[200][200];//物品选取,背包承重 int max( 约定不等于承诺〃/ 2022年06月08日 06:15/ 0 赞/ 238 阅读
相关 01背包问题 【例9.11】01背包问题 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 一个旅行者有一个最多能装M公斤的背包,现在有n件物 淩亂°似流年/ 2022年06月08日 03:59/ 0 赞/ 235 阅读
相关 背包问题—01背包、完全背包 01背包问题 题目 有m件物品和一个容量为V 的背包。放入第i 件物品占用的体积是Vi,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。 思路 这 末蓝、/ 2022年05月30日 10:10/ 0 赞/ 365 阅读
相关 01背包问题 简单背包问题 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。 问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S 痛定思痛。/ 2022年05月26日 12:18/ 0 赞/ 234 阅读
相关 01背包问题 转载:[https://blog.csdn.net/xp731574722/article/details/70766804][https_blog.csdn.net_xp73 怼烎@/ 2022年05月06日 15:00/ 0 赞/ 287 阅读
相关 背包问题01 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c\[i\],价值是w\[i\]。求解将哪些物品装入背包可使价值总和最大。 基本思路 这是最基础的背包问题,特 左手的ㄟ右手/ 2022年01月29日 11:34/ 0 赞/ 327 阅读
还没有评论,来说两句吧...