动态规划实现0-1背包问题
2018-12-09 14:29
120 查看
//动态规划实现0-1背包 public class DN01 { public static void dy(int []v,int []w,int c,int [][]m){ int n=v.length-1; //i=n int jMax=Math.min(w -1, c); for(int j=0;j<=jMax;j++) { m [j]=0; } for(int j=w ;j<=c;j++) { m [j]=v ; } //i从n-1到1 for(int i=n-1;i>=1;i--) { jMax=Math.min(w[i]-1, c); for(int j=0;j<=jMax;j++) { m[i][j]=m[i+1][j]; } for(int j=w[i];j<=c;j++) { m[i][j]= Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]); } } //也可以把i=1单独拿出来,这样减少了计算次数 /*m[1][c]=m[2][c]; if(c>=w[1]) { m[1][c]= Math.max(m[1][c],m[2][c-w[1]]+v[1]); }*/ } public static void gh(int[][]m,int c,int x[],int []w) { int n=w.length-1; //i从1到n-1 for(int i=1;i<n;i++) { if(m[i][c]==m[i+1][c]) { x[i]=0; } else { x[i]=1; c=c-w[i]; } } //i=n x =(m [c]>0)?1:0; } public static void main(String[] args) { int []w= {3,4,5,2}; //存各个物品重量 int []v= {7,9,9,2}; //存各个物品价值 int n=v.length-1; int c=6; //背包容量 int m[][] = new int[n+1][c+1]; //m[i][j]表示当背包容量为j,可选物品为i,i+1,,,n时的问题最优值 dy(v,w,c,m); int []x=new int[n+1]; gh(m,c,x,w); int sum=0; for(int i=1;i<=n;i++) { sum=sum+x[i]*v[i]; } System.out.println(sum); } }阅读更多
相关文章推荐
- 0-1背包问题与完全背包问题C++实现 动态规划
- 01背包问题 动态规划 c语言实现
- 0-1背包问题与完全背包问题C++实现 动态规划
- 动态规划(背包问题,最长递增子序列,硬币问题)java实现
- 动态规划之0/1背包问题-java实现
- c++实现0-1背包问题完整源码(动态规划实现)
- 【算法数据结构Java实现】Java实现动态规划(背包问题)
- 算法java实现--动态规划--0-1背包问题
- 动态规划三部曲之01背包问题的分析和实现(二)
- 0/1背包问题----动态规划实现
- 《JAVA》中利用《动态规划》实现《背包》问题
- 0/1背包问题 - 动态规划(C++实现)
- c++实现0-1背包问题完整源码(动态规划实现)
- 动态规划求解背包问题(JAVA实现)
- 动态规划-背包问题九讲及其代码实现
- 背包问题 动态规划 滚动数组实现
- 0-1背包问题与完全背包问题C++实现 动态规划
- 【笔记】【算法学习】【动态规划】背包问题总结(1)
- Java实现0-1背包问题
- C++实现动态规划算法之解决0-1背包问题