算法 0-1背包问题
来源:互联网 发布:gbk转utf8 linux 编辑:程序博客网 时间:2024/05/30 23:40
题目
给定n种物品和一个背包。物品i的重量是wi,价值是vi,背包的容量为c。
问应如何选择装入背包的物品,使装入背包中物品的总价值最大?
分别使用回溯法和动态规划编码。
分析
m[i][j]={ max{ m[i-1][j],m[i-1][j-wi]+vi } } 其中wi<=j
m[i][j]=m[i-1][j] 其中 wi>j>0
回溯法:
#include <stdio.h> #include <math.h> #define n 5 //物品数#define c 10 //背包最大容量int w[n]={2,2,6,5,4};//物品的重量int v[n]={6,3,5,4,6};//物品的价值int x[n]={0};int bestx[n]={0};int tempW;//当前重量int tempV;//当前价格int maxValue;void dfs(int t){ if(t>=n){ if(tempV>maxValue){ maxValue=tempV; for(int i=0; i<n; i++) bestx[i]=x[i]; } return; } for(int i=0; i<=1; i++){ x[t]=i; //不装 if(x[t]==0){ dfs(t+1); x[t]=0; } //装 if(tempW+w[t]<=c && x[t]==1){ tempW+=w[t]; tempV+=v[t]; dfs(t+1); x[t]=0; tempW-=w[t]; tempV-=v[t]; } } }int main(){ dfs(0); printf("%d\n",maxValue); for(int i=0; i<n; i++){ printf("%d\t",bestx[i]); } return 0; }
动态规划:
#include<stdio.h>#define n 5int w[n]={2,2,6,5,4};//物品的重量int v[n]={6,3,5,4,6};//物品的价值int x[n];//物品的选取状态,选中则是1,没选中为0int c=10;//背包最大容量int V[100][100]={0};//前i个物品装入容量为j的背包中获得的最大价值int getMax(int a,int b){ return a>b?a:b;}void suanfa(){ int i,j; for(i=0; i<n; i++){ for(j=0; j<=c; j++){ if(j<w[i])//小于 V[i][j]=V[i-1][j]; else//大于 V[i][j]=getMax(V[i-1][j],V[i-1][j-w[i]]+v[i]); } } j=c; for(i=n-1; i>=0; i--){ if(V[i][j]>V[i-1][j]){ x[i]=1; j=j-w[i]; }else x[i]=0; } printf("选中的物品下标:\n"); for(i=0; i<n; i++) printf("%d\t",x[i]); printf("\n最优值:%d\n",V[n-1][c]); }int main(){ suanfa(); return 0; }
0 0
- 算法0-1背包问题:
- 【算法】0-1背包问题
- 算法 0-1背包问题
- 【算法】贪心算法(0-1背包问题)
- 【算法】贪心算法(0-1背包问题)
- 0-1背包问题、背包问题(贪心算法)
- 【算法导论】0-1背包问题 与 部分背包
- 经典算法之背包问题(0-1背包)
- 【算法导论】0-1背包问题 与 部分背包
- 算法1-3:0-1背包问题
- 贪心算法运用于(0/1)背包问题
- 回溯算法之0-1背包问题
- 0/1背包问题的贪心算法
- 0/1背包问题遗传算法
- 贪心算法---0/1部分背包问题
- 贪心算法解决0 1背包问题
- 遗传算法解决0-1背包问题
- 【算法导论】0-1背包问题
- Lifecycle Sorter插件
- codeforce 659B
- 如何禁止svg图的放大缩小功能
- eclipse常用插件地址(不断更新)
- hadoop系列:zookeeper(2)——zookeeper核心原理(选举)
- 算法 0-1背包问题
- 使用sklearn做特征工程
- 怎么计算union和struct中字节数计算
- Linux yum 命令介绍
- spring mvc返回json 类型的 数据
- GitHub vs GitLab:它们有什么区别?
- hadoop系列:zookeeper(1)——zookeeper单点和集群安装
- opencv 训练自己的分类器
- 数据结构与算法