日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

新魔法药水

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新魔法药水 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

商店里有N種藥水,每種藥水都有一個售價和回收價。小S攢了V元錢,還會M種魔法,可以把一些藥水合成另一種藥水。他一天可以使用K次魔法,問他一天最多賺多少錢?

輸入輸出格式

輸入格式:

第一行四個數N、M、V、K

接下來N行,每行兩個數,表示藥水的售價和回收價。

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

輸出格式:

一個數,表示小S的最大利潤

輸入輸出樣例

輸入樣例#1:

4 2 6 3
1 0
1 0
5 3
20 15
3 2 1 2
4 3 1 2 3

輸出樣例#1:

12

說明

N<=60 M<=240

V<=1000

k<=30


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

跟昊哥一塊搞的

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

這可以用分層 + 背包來做

就是一層一層的更新

求出 v 數組以后直接簡單背包一下就好辣

#include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> const int M = 245 ; const int N = 1005 ; const int INF = 1e9 + 7 ; using namespace std ; inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }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) {memset(temp , 63 , sizeof(temp)) ;temp[0][0] = 0 ;for(int i = 0 ; i <= m ; i ++)for(int j = 1 , u ; j < p[t].size() ; j ++) {u = p[t][j] ;for(int k = 0 ; k <= i ; k ++) {temp[j][i] = min(temp[j][i] , temp[j - 1][i - k] + v[u][k]) ;}}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() {n = read() ; m = read() ; W = read() ; tot = read() ;for(int i = 1 ; i <= n ; i ++) {val[i] = read() ;cost[i] = read() ;for(int j = 0 ; j <= tot ; j ++)v[i][j] = val[i] ;}for(int i = 1 , x , Num ; i <= m ; i ++) {res[i] = read() ; Num = read() ; p[i].push_back(0) ;while(Num -- ) {x = read() ;p[i].push_back(x) ;}}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 ; }

轉載于:https://www.cnblogs.com/beretty/p/9671206.html

總結

以上是生活随笔為你收集整理的新魔法药水的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。