BZOJ3312 不找零(狀壓DP)

2021-08-09 05:40:51 字數 825 閱讀 2560

題目大意:

按順序買 n個物品(1 <= n <= 100,000),第i個物品花費c(i),(1<=c(i)<=10,000),用k(1<=k<=16)個面值的範圍是 1..100,000,000 硬幣支付。購買過程中,可隨時停下來付款,每次付款只用乙個硬幣,支付從上一次支付後到現在的這些所有物品的**(如果錢夠)。如果硬幣面值大於所需的費用,不找零。計算買完n個物品後最多剩下多少錢。無法支付所有物品則輸出-1。

題解:看k的範圍,狀壓dp。把使用硬幣的情況壓起來,算出每一種硬幣使用情況s下最多能支付前多少件物品dp[s]。思路比較好理解,實現細節詳見**。

code

#include

#include

#include

#include

#include

using

namespace

std;

inline

int read()

while (c<='9'&&c>='0')

return num*f;

}long

long s[100005],dp[100005],tot,ans;

int n,m,k[17];

int main()

ans=1e17;

for (int s=0;s<=all;s++)

if (dp[s]==n)

if (ans>tot) puts("-1");

else

printf("%lld",tot-ans);

return

0;}

bzoj 1076(狀壓dp)(期望dp)

傳送門 題解 dp i j 表示第i輪狀態為j 狀態中為1的位表示當前物品還沒被取走 的最大期望得分。為了防止從無效狀態轉移至有效狀態,採用倒推法,從已知的有效狀態往回推,具體注釋在 中。p.s.不寫memset可以快接近一倍,但是為了思維嚴密性,還是寫乙個,反正都能過 注意 由於吃過的寶物可以再吃...

BZOJ 4152 狀壓DP 解題報告

4152 amppz2014 the captain time limit 給定平面上的n個點,定義 x1,y1 到 x2,y2 的費用為min x1 x2 y1 y2 求從1號點走到n號點的最小費用。input 第一行包含乙個正整數n 2 n 200000 表示點數。接下來n行,每行包含兩個整數x...

bzoj5299 狀壓DP 解鎖螢幕

description 使用過android手機的同學一定對手勢解鎖螢幕不陌生。android的解鎖螢幕由3x3個點組成,手指在螢幕上畫一條 線將其中一些點連線起來,即可構成乙個解鎖圖案。如下面三個例子所示 畫線時還需要遵循一些規則 1 連線的點數不能少於4個。也就是說只連線兩個點或者三個點會提示錯...