package dongtaiguihua;
//有N件物品和一個容量爲V的揹包。第i件物品的體積是c[i],價值是v[i]。求解將哪些物品裝入揹包可使價值總和最大。
// 體積c[5] = {3,5,2,7,4}; 價值爲 v[5] = {2,4,1,6,5};揹包的體積爲10
//問題分解:
//“將前i件物品放入容量爲y的揹包中”這個子問題,若只考慮第i件物品的策略(放或不放),
//那麼就可以轉化爲一個只牽扯前i-1件物品的問題。
//如果不放第i件物品,那麼問題就轉化爲“前i-1件物品放入容量爲y的揹包中”,價值爲f[i-1][y];
//如果放第i件物品,那麼問題就轉化爲“前i-1件物品放入剩下的容量爲y-Wi的揹包中”,
//此時能獲得的最大價值就是f[i-1][y-Wi]再加上通過放入第i件物品獲得的價值Pi。
//所以只要比較一下f[i-1][j]的價值大還是f[i-1][y-Wi]+pi價值大即可
public class BeiBao {
public static void main(String[] args) {
int[] c = {3,5,2,7,4};//物品體積
int[] v = {2,4,1,6,5};//物品價值
int begV = 10;//揹包體積
int[][] cvs = new int[5][10];
for(int i = 1; i < c.length;i++){
for(int j = 1 ; j < begV ; j++){
//如果體積太大,放不進去
System.out.println("把第"+i+"個物品放到體積爲"+j+"的袋子中");
if(c[i]>j){
cvs[i][j] = cvs[i-1][j];
System.out.println("太大了,沒有放進去");
}else{
if(cvs[i-1][j]>cvs[i-1][j-c[i]]+v[i]){
System.out.println("不放第"+i+"個物品");
}else{
System.out.println("放第"+i+"個物品");
}
cvs[i][j] = max(cvs[i-1][j],cvs[i-1][j-c[i]]+v[i]);
System.out.println("價值是"+cvs[i][j]);
}
System.out.println("---------------");
}
System.out.println();
System.out.println("=============");
}
System.out.println();
}
public static int max(int a,int b){
return a>b?a:b;
}
}
不能確定是否正確,還有一些疑問。並沒有思考的很清楚,但是應該是這個思路,需要在邊界等細節上好好考慮一下。