考前日誌 11 12

2022-07-12 00:27:15 字數 3255 閱讀 4055

在動態規劃問題需要給出方案時,通常做法是額外使用一些與dp狀態大小相同的陣列記錄下來每個狀態的「最優解」是從何處轉移而來的。最終用 dp 求出最優解後,通過一次遞迴,沿著記錄的每一步「轉移**」回到初態,即可得到一條從初態到最優解的轉移路徑,也就是所求的具體方案。

題目分析

比較巧妙的轉化,但是輸出方案的時候出了問題,迫使我看了y總的輸出方案**……不知道自己的為啥不行,放坑了

首先乙個性質:貪婪度越大的孩子獲得的餅乾數應該越多。證明也不難證,直接用貪心中的臨項交換法就行了,不再贅述。因此我們可以把小朋友按照貪婪值從大到小排序,這樣之後他們分配到的餅乾數量是單調遞減的。

狀態設計:設 \(f_\) 表示前 \(i\) 個小朋友分了 \(j\) 塊餅乾所得到的最小怨氣值總和。

狀態轉移:

由此可得整個dp的轉移方程為:

\[f_=\min\beginf_&\text j\ge i\\\min\limits_^(f_+k\times\sum\limits_^g_x)&\textj\ge(i-k)\end

\]初始條件為 \(f_=0\),最終目標為 \(f_\)。

輸出方案有點迷……

**

#include #include #include #include #include #include #include #define pii pair using namespace std;

const int a = 33;

const int b = 5011;

const int mod = 1e9 + 7;

const int inf = 0x3f3f3f3f;

inline int read()

pii g[a];

int n, m, f[a][b], sum[a], ans[a];

int main()

sort(g + 1, g + 1 + n);

reverse(g + 1, g + 1 + n);

for (int i = 1; i <= n; i++)

sum[i] = sum[i - 1] + g[i].first;

memset(f, inf, sizeof(f));

f[0][0] = 0;

for (int i = 1; i <= n; i++)

} cout << f[n][m] << '\n';

int i = n, j = m, h = 0;

while (i && j) }}

} for (int i = 1; i <= n; i++) cout << ans[i] << " ";

puts("");

return 0;

}

比較簡單了,隨便寫寫

有 \(n\) 件物品和乙個容量為 \(m\) 的揹包。第 \(i\) 件物品的體積是 \(v_i\),價值是 \(w_i\)。求解將哪些物品裝入揹包且容量不超過 \(m\) 可使價值總和最大。

\(f_\)表示前 \(i\) 件物品恰放入乙個容量為 \(j\) 的揹包可以獲得的最大價值,轉移方程為

\[f_=\max\beginf_\\f_+w_i&\text\ge\end

\]初始化 \(f_=0\),目標為 \(\max\limits_^}\)。

for (int i = 1; i <= n; i++) 

}

可以用滾動陣列優化空間。

int f[2][maxn_m+1];

int now = 0, last = 1;

for (int i = 1; i <= n; i++)

}

其實可以直接壓掉第一維,此時第二維需要使用倒序列舉的方法。

我是**

我是01揹包壓維的**

01揹包板子題。

#include #include #include #include #include #include #include using namespace std;

const int a = 1e5 + 11;

const int b = 1e6 + 11;

const int mod = 1e9 + 7;

const int inf = 0x3f3f3f3f;

inline int read()

int n, m, f[a], a[a];

int main()

有 \(n\) 種物品和乙個容量為 \(m\) 的揹包。每種物品都有無限個,第 \(i\) 種物品的體積是 \(v_i\),價值是 \(w_i\)。求解將哪些物品裝入揹包且容量不超過 \(m\) 可使價值總和最大。

\(f_\)表示前 \(i\) 件物品恰放入乙個容量為 \(j\) 的揹包可以獲得的最大價值,轉移方程為

\[f_=\max\beginf_\\f_+w_i&\text\ge\end

\]初始化 \(f_=0\),目標為 \(\max\limits_^}\)。

同樣可以壓掉一維,但是正序列舉就可以了,因為乙個物品可以選多次。

int f[100010], n, m, v[a], w[a];

for (int i = 1; i <= n; i++)

for (int j = v[i]; j <= m; j++)

f[j] = max(f[j], f[j - v[i]] + w[i]);

int ans = 0;

for (int i = 0; i <= m; i++) ans = max(ans, f[i]);

cout << ans << '\n';

還是板子題……

#include #include #include #include #include #include #include #define int long long

using namespace std;

const int a = 1e5 + 11;

const int b = 1e6 + 11;

const int mod = 2147483648;

inline int read()

int n, f[a];

signed main()

} cout << f[n] << '\n';

return 0;

}

自動刪除n天前日誌

linux是乙個很能自動產生檔案的系統,日誌 郵件 備份等。雖然現在硬碟廉價,我們可以有很多硬碟空間供這些檔案浪費,讓系統定時清理一些不需要的檔案很有一種爽快的事情。不用你去每天惦記著是否需要清理日誌,不用每天收到硬碟空間不足的報警簡訊,想好好休息的話,讓我們把這個事情交給機器定時去執行吧。1.刪除...

2020NOIP賽前日誌

11.22 週日 把小機房的電腦都開機檢察了一遍,發現有不少都不大好用 密碼未知,無法連線網路,我不習慣 會 用ubuntu等 後來選定了一台跟前機主高三學長htc溝通了一下,於是我在機房見哪台沒人用哪台的漂流生活結束了,下午裝了一下vscode,然後就去上化學了。11.23 周一 上午把vscod...

linux 自動刪除n天前日誌

1.刪除檔案命令 find 對應目錄 mtime 天數 name 檔名 exec rm rf 例項命令 find opt soft log mtime 30 name log exec rm rf 說明 將 opt soft log 目錄下所有30天前帶 log 的檔案刪除。具體引數說明如下 fin...