題目大意:
按順序買 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個。也就是說只連線兩個點或者三個點會提示錯...