Fanka問題の説明 UESTC本社の社員食堂の食事カードは購入前にバランスを決定する非常に奇妙なデザインをしています。製品を購入する前にカードの残量がより多いまたは$ 5と等しい場合、成功を購入することができるようになります(でも、カードの残高を購入した後、負である)、または(量が十分であっても)を購入することはできません。すべてのカードの最低残高を維持するために試してみたい、私たちはそう。
入力 複数のデータセット。各データセットについて:
出力 整数を含む各入出力ラインの場合は、カード上の可能な最小のバランスを表します。
サンプル入力 1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
サンプル出力 -45 32
最も高価な料理を購入するために5ドルを取得し、残りは、M-5のナップザック問題のバックパックの容量に変換することができます。 なぜ最も高価なを購入する5ドル程度取得は、最適なソリューションです。 そして最後に、皿が最も高価ではありません買いました 全体のプロセスは、最も高価なを購入していない場合は1、最も高価な皿に最後には、より良い結果を得ることができます。 2は、最も高価なを購入する過程、最も高価と最後のスワップは、同じ結果を得ることができます。 質問:最後に、食品の料理は他の最も高価な購入すると購入するために最も高価な時間を購入していないが、同じではありませんが、異なる組み合わせは、より良い結果を生むことがあります。 1は、食べ物を買うために二回、のような、あなたは上記の説明を参照することができます。 二回食べ物を買うために、より良い一致があり、二つが結合していること、同じではありません2、仮定が成り立ちません。
故状态方程为sum[i][j]=max(sum[i-1][j],sum[i-1][j-p[i]]+p[i]); sum[i][j]为对第i个物品做出选择后在金额为j的情况下的最大花销。p[i]为第i个物品的价格。即在对第i个物品做出选择(买或不买)时达到的最大花销为max(不买第i个物品时所有金额买其他的物品能达到的最大花销,买第i个物品时剩余金额买其他物品能达到的最大花销+p[i])。 遇到的问题,定义二维数组时int sum[1001][1001]时出错,但是数组较小时则不会,此处存疑。故改为用vector。
空间优化 状态方程:sum[j]=max(sum[j],sum[j-p[i]]+p[i]); 即采用更新的方式,等式左边sum[j]为当前外层循坏为i求得的值,右边sum[j]为外层循坏为i-1求得的值。 式中右边sum[j-p[i]]中j-p[i]<j,故内层循环采用逆序,即由大到小,否则式子右边sum[j-p[i]]不是前一个状态保留的值,而是当前状态更新过的值。
|
hdu2546(01ナップザック問題)
おすすめ
転載: blog.csdn.net/treble_csnd/article/details/81565703
おすすめ
ランキング