ホームページ > バックエンド開発 > PHPチュートリアル > PHPで重み付けを実装する方法の紹介

PHPで重み付けを実装する方法の紹介

不言
リリース: 2023-04-02 12:12:01
オリジナル
2555 人が閲覧しました

php実装 計量分銅(バックパック)

1. まとめ

一文要約:

1. dpの本質とは何か?

テーブルをブラシし、時間のためにスペースを使用します

テーブルを描画すると速くなります

13 //动态规划就是一个表
14 //至于这个表的更新就是上面层的表更新下面层的,是逐级更新还是跳级更新要注意
15 //把表画出来做的更快
ログイン後にコピー

2. dp の初期状態を取得する方法 (実際には、最初に考えられるのは、要求された状態を使用することです)?

実際、最初に思いつくのは、必要な状態を使用して状態を作ることです

 4 //dp就是思考变量(然后变量组合成初始状态):变量有用几种砝码,每种砝码有多少个,重量为多少
ログイン後にコピー

3. dp の状態遷移方程式を取得するにはどうすればよいでしょうか?

別の初期状態で試してください

1 つの次元が機能しない場合は 2 つの次元に追加し、2 つの次元が機能しない場合は 3 つの次元に追加します

4。ここで中間配列を初期化するのを忘れました(異なるデータセット間)?

26     $dp=null;
27     $dp[0]=1;
ログイン後にコピー

2. 重りの計量 (バックパック)

問題の説明

重みが等しくない重りのセット、つまり m1、m2、m3...mn があります。
各重みに対応する量は x1、x2、x3...xn です。次に、これらの重りを使用して物体の重さを量り、いくつの異なる重さを計量できるかを尋ねます。

注:

計量値には 0 が含まれます

メソッドのプロトタイプ: public static int fama ( int n, int[] 重み, int[] nums)

入力説明:

输入包含多组测试数据。
对于每组测试数据:
第一行:n --- 砝码数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每个砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每个砝码的数量(范围[1,6])
ログイン後にコピー

出力説明:

指定された重量を使用して計量できるさまざまな重量

例 1

入力

2
1 2
2 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(&#39; &#39;,$w);
 20     $num=explode(&#39; &#39;,$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 ?>
ログイン後にコピー

以上がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

リンクが有効かどうかを判断するための PHP 方法

AOP を実装する PHP の基礎

php で短い接続を生成する方法

以上がPHPで重み付けを実装する方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート