2023年8月15日提高組T2 購買

2021-08-06 07:46:06 字數 1282 閱讀 2426

bpm想要購買m種物品,每種物品只用購買一件。現在一共有n家商店,但走到第i家商店的路費為d[i],而在第i家商店購買第j種物品的花費為c[i,j]。問你最少需要花費多少錢。

第一行包含兩個正整數n,m,表示商店數和物品數。

接下來n行,每行先是乙個正整數d[i],表示到第i家商店的路費。接下來m個正整數,依次表示c[i,j]。

一行乙個整數,表示最小花費。

對於前30%的資料,1<=n,m<=7

對於前100%的資料,1<=n<=100,1<=m<=16,d[i],c[i,j]<=1000000

by bpm

資料中m極小,考慮狀壓dp

設f[i][j]為前i物品取狀態為j的最小花費

可以發現每家商店最多進去一次,即d[i]最多隻需要計算一次,那麼每次單獨拎出來+d[i]即可

#include 

#include

#include

#include

#include

#include

#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)

#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)

#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)

#define fill(x, t) memset(x, t, sizeof(x))

#define max(x, y) (x)>(y)?(x):(y)

#define min(x, y) (x)<(y)?(x):(y)

#define ll long long

#define db double

#define inf 0x3f3f3f3f

#define n 101

#define m 17

#define l 1<<16|1

int f[2][l], c[n][m], d[n];

int main(void)

}fill(f, 31);

f[0&1][0] = 0;

int lim = (1

<< m) - 1;

rep(i, 1, n)

rep(k, 1, m)

}rep(j, 0, lim)

}printf("%d\n", f[n&1][lim]);

return

0;}

2023年8月15日提高組T2 購買

description bpm想要購買m種物品,每種物品只用購買一件。現在一共有n家商店,但走到第i家商店的路費為d i 而在第i家商店購買第j種物品的花費為c i,j 問你最少需要花費多少錢。input 第一行包含兩個正整數n,m,表示商店數和物品數。接下來n行,每行先是乙個正整數d i 表示到第...

2023年8月9日提高組T2 覆蓋

現在小b拿到了一條長度為n的木塊,初始時上面什麼顏色都沒有。為了美觀,現在小b希望把它的n個單位長度分別塗上紅 綠 藍三種顏色,每種顏色可以用乙個大寫字母表示,分別是 rgb。作為乙個不合格的油漆工,每次你可以把一段連續的木版塗成隨意一種顏色,但是你發現,後塗的顏色會覆蓋先塗的顏色。為了方便,請你用...

2023年8月8日提高組T2 呀!回文串

小b的名字是由前n個小寫字母組成的乙個長度為m字串。一天,小b看上了乙個金髮碧眼的漂亮妹子,但妹子在知道了小b的名字後,就無情地拋棄了小b,而原因竟然是小b的名字不夠優美!在小b的追問下,妹子告訴小b,只有回文串是優美的。於是小b決定把自己的名字變得優美,但每加入或刪除乙個字母都要付出一定的代價。為...