动态规划:是求解决策过程(decision process)最优化的数学方法。
最常见的0,1背包问题
public void Sort_01bag(){
// m : 表示背包的最大容量
// n : 表示商品的个数
// w : 表示商品重量数组
// v : 表示商品价值数组
int m=10;
int n=6;
int w[]={3,4,2,5,6,7};
int v[]={6,5,8,3,2,1};
//c[i][m] 表示前i件物品恰好放入重量为m的背包时的最大价值
int c[][] = new int[n+1][m+1];
for(int i=0;i<n+1;i++){
c[i][0] = 0;
}
for(int j=0;j<m+1;j++){
c[0][j] = 0;
}
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
//当物品为i件重量为j时,如果第i件的重量(w[i-1])小于重量j时,c[i][j]为下列两种情况之一:
//(1)物品i不放入背包中,所以c[i][j]为c[i-1][j]的值
//(2)物品i放入背包中,则背包剩余重量为j-w[i-1],所以c[i][j]为c[i-1][j-w[i-1]]的值加上当前物品i的价值
if(w[i-1] <= j){
if(c[i-1][j] <c[i-1][j-w[i-1]]+v[i-1]){
c[i][j] = c[i-1][j-w[i-1]]+v[i-1];
}else{
c[i][j] = c[i-1][j];
}
}else{
c[i][j] = c[i-1][j];
}
}
}
System.out.println(c.toString()); ;
}