我一開始沒往揹包那想,我想的是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,...