bool型別:f[i][j] i這個數額,由j個郵票貼成 是否可行。 f[i][j] =
換乙個思路
f[i] i這個數額,最少由幾張郵票組成。
f[i] = min + 1 其中i的數額最高可以到達 pk也就是10000*200=2000000的空間和時間其實都是很大了。 再加上每次轉移是o(k),還是會tle。
但是這裡我只需要找一些數字,也就是只有用到f[i-p],而在f陣列更靠前的地方,其實是用不到那些空間了。那麼可以在這裡考慮到空間優化,優化到o(10000)的空
間。這就是無壓力可以接受的了。
接下來是轉移的問題。
假如有1,2,5 這幾個面額。 對於 10而言,可以從9,8,5轉移。從f[9] f[8] f[5]找乙個最小值。 接下來是從f[6] f[9] f[10]找最小值…… 貌似沒有什麼可以優化
的,雖然是找最小值,但是並不是區間上的最小值查詢,而且不具有連續性,所以貌似不好用堆或者線段樹來解決……
最終時間複雜度
2000000 * 50 = 10000000 = 10^8 應該不會tle。 但是這麼不優秀的演算法,我實在不開心啊……
compiling...compile: ok
executing...
test 1: test ok [0.005 secs, 3416 kb]
test 2: test ok [0.003 secs, 3416 kb]
test 3: test ok [0.003 secs, 3416 kb]
test 4: test ok [0.003 secs, 3416 kb]
test 5: test ok [0.003 secs, 3416 kb]
test 6: test ok [0.000 secs, 3416 kb]
test 7: test ok [0.005 secs, 3416 kb]
test 8: test ok [0.005 secs, 3416 kb]
test 9: test ok [0.008 secs, 3416 kb]
test 10: test ok [0.057 secs, 3416 kb]
test 11: test ok [0.467 secs, 3416 kb]
test 12: test ok [0.100 secs, 3416 kb]
test 13: test ok [0.005 secs, 3416 kb]
all tests ok.
只用了3m的空間~~~ 這點倒是我很滿意的地方啦啦啦啦啦啦啦啦~~~~
/*
task:stamps
lang:c++
*/#include #define inf 10000
#define min(a, b) ((a)<(b)?(a):(b))
#define size 13000
int k, n;
int a[50];
int f[size]=, now=0, ans=0, tmp, minnum;
int main()
if (minnum >= k) break;
f[now] = minnum + 1;
} printf("%d\n", ans - 1);
return 0;
}
演算法 動態規劃 郵票問題
題目描述 已知乙個 n 枚郵票的面值集合 如,和乙個上限 k 表示信封上能夠貼 k 張郵票。計算從 1 到 m 的最大連續可貼出的郵資。例如,假設有 1 分和 3 分的郵票 你最多可以貼 5 張郵票。很容易貼出 1 到 5 分的郵資 用 1 分郵票貼就行了 接下來的郵資也不難 6 3 3 7 3 3...
usaco 3 4 rockers 動態規劃
f disk song ti 表示用前disk張光碟,錄製前song首歌曲 不一定錄製第song首歌曲 的最大曲目數,並且當前在錄的光碟剩餘時間是ti f disk song ti max f disk song 1 ti f disk 1 song 1 t a song disk 1 a song...
USACO動態規劃之揹包問題1
序言 dp太辣雞所以要刷題!做完usaco裡dp專題的所有題!然而還有數字dp插頭dp的都還不會qwq 題目 題解 一 subset sums,usaco 1998 spring 解題思路 因為平分,所以以和的一半當總容量做01揹包。答案除以2,因為會重複算一次 include include in...