題目**
題意:
給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/ cout
}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 時空開...