四方定理 dp,二維費用揹包

2021-10-10 02:42:46 字數 1068 閱讀 6268

我一開始沒往揹包那想,我想的是dp[i][j]表示 i 值 剩餘 j 次分解位的方案總數。

第一層 for 遍歷 i 值 (1-32768)

第二層for 遍歷 j 分解位個數 (0-4)

第三層for 遍歷 k 平方數 (1-sqrt(i))

dp[i][j] = dp[i-k*k][j-1]

這樣寫理論上可以實現,但是無法去重。

假設i=5, j=1,k 可以取 1, 2. k取1就由dp[4][0]推來,k取2就由dp[1][0]推來。這樣就包含了[1,2]和[2,1]兩種情況。

後來看了題解才發現是乙個二位費用完全揹包問題。

多少個平方數就表示有多少種物品,給出的n表示揹包容量。

每個平方數可選無限次,每個平方數 x 消耗 x*x 體積和 1 個分解位。

可以定義dp[i][j][k]表示前 i 種平方數,剩餘總和 j,剩餘選擇 j 的方案總數。

dp[i][j][k] += dp[i-1][j-i*i][k-1]

通過完全揹包可以除去 i 那一維。

經驗:以後看dp,凡是看到決策涉及到選與不選,選多個這種題型都先往揹包方向考慮一下。

#include

#include

#include

using

namespace std;

//當成二維費用完全揹包問題

//有多少個平方數就表示有多少種物品,給出的n表示揹包容量

//每個平方數可選無限次,每個平方數x消耗x*x體積和1個分解位

intmain()

}}int t;

scanf

("%d"

,&t)

;while

(t--

)return0;

}

DP複習 二維費用的揹包

就是乙個01揹包的進化版。但是涉及狀態的時候要設兩種狀態。題目背景 nasa 美國航空航天局 因為太空梭的隔熱瓦等其他安 全技術問題一直大傷腦筋,因此在各方壓力下終止了航天 飛機的歷史,但是此類事情會不會在以後發生,誰也無法 保證,在遇到這類航天問題時,解決方法也許只能讓航天 員出倉維修,但是多次的...

DP複習 二維費用的揹包

for int i 1 i n i for int j v j w i j for int k t k g i k dp j k max dp j k dp j w i k g i v i 例題 題目背景 nasa 美國航空航天局 因為太空梭的隔熱瓦等其他安 全技術問題一直大傷腦筋,因此在各方壓力下...

二維費用揹包專題

在01揹包的基礎上多列舉一維即可。需要注意的是,題目中有隱含條件,比如人數最多選m mm人,因此人數也將成為一維。當然多維費用揹包也可以模擬二維。題解二維費用揹包板子 include define m 1009 using namespace std int a m b m c m f m m n,...