新魔法藥水

2022-08-13 15:57:15 字數 1803 閱讀 5566

商店裡有n種藥水,每種藥水都有乙個售價和**價。小s攢了v元錢,還會m種魔法,可以把一些藥水合成另一種藥水。他一天可以使用k次魔法,問他一天最多賺多少錢?

第一行四個數n、m、v、k

接下來n行,每行兩個數,表示藥水的售價和**價。

接下來m行,每行若干個數,第乙個數表示魔法的成品,第二個數是原料的種數,接下來為各種原料的編號

乙個數,表示小s的最大利潤

4 2 6 3

1 01 0

5 320 15

3 2 1 2

4 3 1 2 3

n<=60 m<=240

v<=1000

k<=30

就是個揹包,但是挺麻煩的

跟昊哥一塊搞的

先預處理出\(v[i][j]\)表示使用j次魔法後變成第i個物品的花費

這可以用分層 + 揹包來做

就是一層一層的更新

求出 v 陣列以後直接簡單揹包一下就好辣

#include#include#include#include#includeconst int m = 245 ;

const int n = 1005 ;

const int inf = 1e9 + 7 ;

using namespace std ;

inline int read()

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

return x*w ;

}int n , m , w , tot ;

int val[m] , cost[m] ;

int v[m][m] , res[m] ;

int temp[m][m] ;

vector < int > p[m] ;

int f[n][m >> 2] ;

inline void update(int t , int m)

}v[res[t]][m + 1] = min( v[res[t]][m + 1] , temp[p[t].size() - 1][m] ) ;

for(int i = m + 1 ; i <= tot ; i ++)

v[res[t]][i] = min(v[res[t]][i] , v[res[t]][m + 1]) ;

}int main()

for(int i = 1 , x , num ; i <= m ; i ++)

}for(int i = 1 ; i <= tot ; i ++) // i表示使用i次魔法

for(int j = 1 ; j <= m ; j ++) // 第j種魔法

update(j , i - 1) ;

// f[i][j] 表示花i元使用j次魔法的收益

// v[i][j] 表示第i個物品使用j次魔法的花費

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

for(int j = 0 ; j <= tot ; j ++)

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

for(int l = 0 ; l <= j ; l ++)

if(i - v[k][l] >= 0)

f[i][j] = max(f[i][j] , f[i - v[k][l]][j - l] + (cost[k] - v[k][l]) ) ;

cout << f[w][tot] << endl ;

return 0 ;

}

2783 魔法藥水 二分

小a終於來到了最後一題。小明翻找自己的揹包,發現了很多能夠提公升自己能力值的藥水。小a共發現了n種藥水,第i種藥水有ai瓶,使用後能使能力值加bi。但相同種類的藥水,是不能連續使用的。小a覺得自己至少將能力值提公升x x 1 才有把握ak這場新生賽。藥水的味道並不好,小明想盡量少的使用藥水。你能告訴...

Vijos 佳佳的魔法藥水 最短路

發完了k張 佳佳卻得到了乙個壞訊息 他的mm得病了!佳佳和大家一樣焦急萬分!治好mm的病只有一種辦法,那就是傳說中的0號藥水 怎麼樣才能得到0號藥水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 得到一種藥水有兩種方法 可以按照魔法書上的指導自己配置,也可以到魔法商店裡去買 那裡對於每種藥水都有...

佳佳的魔法藥水 樹型dp

發完了 k 張 佳佳卻得到了乙個壞訊息 他的 mm 得病了!佳佳和大家一樣焦急 萬分!治好 mm 的病只有一種辦法,那就是傳說中的 0 號藥水 怎麼樣才能得到 0 號藥 水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 得到一種藥水有兩種方法 可以按照魔法書上的指導自己配置,也可以到魔法商店裡去...