php實現 稱砝碼(背包)
一、總結
一句話總結:
1、dp的實質是什嗎?
刷表啊,用空間換時間
把表畫出來會做得更快
13 //動態規劃就是一個表14 //至於這個表的更新就是上面層的表更新下面層的,是逐級更新還是跳級更新要注意15 //把表畫出來做的更快
2、dp的初始狀態怎麼得到(其實可以最開始想到的就是用所求做狀態)?
其實可以最開始想到的就是用所求做狀態
4 //dp就是思考變數(然後變數組合成初始狀態):變數有用幾種砝碼,每種砝碼有多少個,重量為多少
3、dp的狀態轉移方程怎麼得到?
用不同的初始狀態去試
一維不行就加到二維,二維不行就加到3維
4、這裡又忘記初始化中間數組了(在不同的組資料之間)?
26 $dp=null;27 $dp[0]=1;
二、稱砝碼(背包)
題目描述
現有一組砝碼,重量互不相等,分別為m1,m2,m3…mn;
每種砝碼對應的數量為x1,x2,x3...xn。現在要用這些砝碼去稱物體的重量,問能稱出多少中不同的重量。
註:
稱重重量包括0
方法原型:public static int fama(int n, int[] weight, int[] nums)
輸入描述:
輸入包含多組測試資料。對於每組測試資料:第一行:n --- 砝碼數(範圍[1,10])第二行:m1 m2 m3 ... mn --- 每個砝碼的重量(範圍[1,2000])第三行:x1 x2 x3 .... xn --- 每個砝碼的數量(範圍[1,6])
輸出描述:
利用給定的砝碼可以稱出的不同的重量數
樣本1
輸入
21 22 1
輸出
5
代碼:
1 <?php 2 //php本身是桶,所以這裡用重量來做dp是可以的 3 //初始狀態 最終狀態 狀態轉移方程 4 //dp就是思考變數(然後變數組合成初始狀態):變數有用幾種砝碼,每種砝碼有多少個,重量為多少 5 //f[i][j]表示用了第i種砝碼用了j個所能達到的重量 6 //dp方程為:f[i+1][]=f[i][j]+ 7 8 //f[i][j]表示前i種物品能否達到j重量 9 //f[i][j]=(或者關係)第i件物品取0到n(i)件能夠達到 10 //f[i-1][j]||(取)f[i-1][j]+k*wi[k 0->ni] 11 //f[i][j][k]表示前i種物品取j件能否達到k重量 12 13 //動態規劃就是一個表 14 //至於這個表的更新就是上面層的表更新下面層的,是逐級更新還是跳級更新要注意 15 //把表畫出來做的更快 16 while($n=trim(fgets(STDIN))){ 17 $w=trim(fgets(STDIN)); 18 $num=trim(fgets(STDIN)); 19 $w=explode(' ',$w); 20 $num=explode(' ',$num); 21 $total=10; 22 for($i=0;$i<$n;$i++){ 23 $total+=$w[$i]*$num[$i]; 24 } 25 26 $dp=null; 27 $dp[0]=1; 28 for($i=1;$i<=$n;$i++){ 29 for($j=$total;$j>=0;$j--){ 30 for($k=0;$k<=$num[$i-1];$k++){ 31 if($j-$k*$w[$i-1]>=0&&$dp[$j-$k*$w[$i-1]]){ 32 $dp[$j]=1; 33 break; 34 } 35 }36 }37 }38 echo count($dp).PHP_EOL;39 //print_r($w);40 //print_r($num);41 42 }43 ?>
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!