商店裡有n種藥水,每種藥水都有乙個售價和**價。小s攢了v元錢,還會m種魔法,可以把一些藥水合成另一種藥水。他一天可以使用k次魔法,問他一天最多賺多少錢?
第一行四個數n、m、v、k
接下來n行,每行兩個數,表示藥水的售價和**價。
接下來m行,每行若干個數,第乙個數表示魔法的成品,第二個數是原料的種數,接下來為各種原料的編號
乙個數,表示小s的最大利潤
4 2 6 3n<=60 m<=2401 01 0
5 320 15
3 2 1 2
4 3 1 2 3
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 號藥 水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 得到一種藥水有兩種方法 可以按照魔法書上的指導自己配置,也可以到魔法商店裡去...