[P1860新魔法药水]

Posted slrslr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[P1860新魔法药水]相关的知识,希望对你有一定的参考价值。

题目描述

商店里有N种药水,每种药水都有一个售价和回收价。小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水。他一天可以使用K次魔法,问他一天最多赚多少钱?

输入输出格式

输入格式:

第一行四个数N、M、V、K

接下来N行,每行两个数,表示药水的售价和回收价。

接下来M行,每行若干个数,第一个数表示魔法的成品,第二个数是原料的种数,接下来为各种原料的编号

输出格式:

一个数,表示小S的最大利润

 

好棒的一道$dp$,瞎撸一节课竟然搞出来了。。

其实本质就是一个一维背包和一个二维费用背包套在一起,细节神烦

具体每个变量什么意思写得很清楚了,这种题写上注释自己也不容易出错

$dp$数组胡乱复制wa了好多发。。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 int n,m,V,cnt;
 7 int tmp[61][31];//表示当前处理到i次用了j魔法的最低费用
 8 int f[61][31];//表示第i件物品用j次魔法组成的最低费用
 9 //用tmp更新f
10 int dp[1001][31];//表示当前花费i元用了j次魔法的最大收益
11 //用dp[i][j]-i更新答案 
12 int v[61];//物品的售价 
13 int id[250],sum[250];//每种魔法的成品和需要的原材料个数
14 vector<int>s[250];//每种魔法所需的原料是什么 
15 int main()
16 {
17     memset(f,63,sizeof(f)); 
18     scanf("%d%d%d%d",&n,&m,&V,&cnt);
19     for(int i=1;i<=n;i++) scanf("%d%d",&f[i][0],&v[i]);
20     for(int i=1;i<=m;i++)
21     {
22         scanf("%d%d",&id[i],&sum[i]);
23         for(int j=1;j<=sum[i];j++)
24         {
25             int x; scanf("%d",&x);
26             s[i].push_back(x);
27         }
28     }
29     for(int i=1;i<=cnt;i++)
30         for(int j=1;j<=m;j++)
31         {
32             memset(tmp,63,sizeof(tmp));
33             tmp[0][0]=0;
34             int T=i-1;
35             for(int k=0;k<=T;k++)
36                 for(int l=1;l<=sum[j];l++)
37                 {
38                     int x=s[j][l-1];
39                     for(int a=0;a<=k;a++)
40                         tmp[l][k]=min(tmp[l][k],tmp[l-1][k-a]+f[x][a]);
41                 }
42             f[id[j]][i]=min(f[id[j]][i],tmp[sum[j]][T]);
43             for(int k=i;k<=cnt;k++) f[id[j]][k]=min(f[id[j]][k],f[id[j]][i]);
44         } 
45     for(int i=1;i<=V;i++)
46         for(int j=0;j<=cnt;j++)
47         {
48             for(int k=1;k<=n;k++)
49                 for(int l=0;l<=j;l++)
50                     if(f[k][l]<=i)
51                         dp[i][j]=max(dp[i][j],dp[i-f[k][l]][j-l]+v[k]-f[k][l]);
52         }
53     printf("%d",dp[V][cnt]);
54     return 0;
55 }

 

以上是关于[P1860新魔法药水]的主要内容,如果未能解决你的问题,请参考以下文章

P1875 佳佳的魔法药水

P1875 佳佳的魔法药水

洛谷—— P1875 佳佳的魔法药水

佳佳的魔法药水

vijos:P1285佳佳的魔法药水

洛谷—— P1875 佳佳的魔法药水