Greetings (列舉子集 dp)

2021-08-28 17:25:32 字數 946 閱讀 1284

題目**

題意:

給n個信(信封有長寬和數目),問在找最多k種信封型別的時候,最少浪費多少紙

思路:

看了看題解,深以為然,這個思路很巧妙,也許是我太菜,沒細想。

我們首先二進位制列舉計算出,每種狀態下,這些信合用同一種信封時的浪費數目。

然後通過列舉子集,dp[ i ] [ j ] 代表 i 種信封,現在已經裝了 j 集合的信封的最小浪費數。

很顯然,對於每種ij    我們從j的子集種去獲取最小值,那麼就是列舉  j 的子集,然後從之前已經退出的 dp[i-1] [ prej ] 中獲得最小答案。

具體實現看**,感覺思路很清晰很巧妙。

狀壓果然優秀。

**:

#include #include #include #include #include #define ll long long

using namespace std;

const int maxn = (1<<15)+20;

ll dp[20][maxn];

int w[maxn],h[maxn];

ll q[maxn],c[maxn],cost[maxn];

int w[maxn],h[maxn],q[maxn];

int main()

// if(j==(1

}ll ans = inf;

int d = (1

ans = min(ans,dp[i][d]);

printf("%lld\n",ans);

return 0;

}

馬的管轄 列舉子集

在中國象棋中,馬是走日字的。乙個馬的管轄範圍指的是當前位置以及一步之內能走到的位置,如果一匹馬的某個方向被蹩馬腳,它就不能往這個方向跳了。自行腦補 那麼問題來了,在乙個 n m 的棋盤內,如何用最少的馬管轄住所有 n m 個格仔。比如 n m 3 時,最少要用 5 隻馬才能管轄所有棋盤,一種可能的方...

列舉 子集生成法1

紫書p188 7.3子集生成 1 增量構造法 1 include2 include3 using namespace std 4int aim 100 5 int psd 100 核心 如下 6int subset int cur,int n,int last 必須使用last元素記錄上層函式新增的...

集合列舉子集 學習筆記

有乙個集合,請輸出它的所有子集。子集,即為被這個這個集合包括的所有集合,包括空集。那麼顯然,假如有 n 個元素,那麼有 2 n 個子集。如何列舉子集呢?首先有乙個顯然的方法 用 2 n 的 dfs 列舉。但這樣有乙個弊端 時空較大,而且比較麻煩。比如乙個動態規劃,你每次轉移都要跑一遍 dfs 時空開...