luogu1048采药

Posted lxyyyy

tags:

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

采药

题目luoguP1048 

    是一个裸的01背包

f[v]表示不超过v的时间时最大价值

技术分享图片
 1 /*
 2 id:gww
 3 language:
 4 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 
 5 */
 6 #include<bits/stdc++.h>
 7 using namespace std;
 8 const int N=100+10;
 9 int t,n,k[N],v[N],f[1000+10];
10 int rd()
11 {
12     int x=0,w=0;char ch=0;
13     while(!isdigit(ch)) {w|=ch==-;ch=getchar();}
14     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
15     return w?-x:x;
16 }
17 
18 int main()
19 {
20     t=rd(),n=rd();
21     for(int i=1;i<=n;i++)
22     v[i]=rd(),k[i]=rd();
23     for(int i=1;i<=n;i++)
24     for(int j=t;j>=v[i];j--)
25     f[j]=max(f[j-v[i]]+k[i],f[j]);
26     printf("%d",f[t]);
27     return 0;
28 }
一维数组

f[i][j]表示前i个草药在时间j之前的最大价值

技术分享图片
 1 /*
 2 id:gww
 3 language:
 4 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 
 5 */
 6 #include<bits/stdc++.h>
 7 using namespace std;
 8 const int N=100+10;
 9 int t,n,k[N],v[N],f[N][1000+10];
10 int rd()
11 {
12     int x=0,w=0;char ch=0;
13     while(!isdigit(ch)) {w|=ch==-;ch=getchar();}
14     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
15     return w?-x:x;
16 }
17 
18 int main()
19 {
20     t=rd(),n=rd();
21     for(int i=1;i<=n;i++)
22     v[i]=rd(),k[i]=rd();
23     for(int i=1;i<=n;i++)//枚举个数
24     for(int j=t;j>=0;j--)
25     {
26         if(j>=v[i])//放得下 
27         f[i][j]=max(f[i-1][j-v[i]]+k[i],f[i-1][j]);
28         else//放不下 
29         f[i][j]=f[i-1][j];
30     }
31     printf("%d",f[n][t]);
32     return 0;
33 }
二维

 

以上是关于luogu1048采药的主要内容,如果未能解决你的问题,请参考以下文章

采药 水题 dp 01背包问题 luogu1048

动态规划的引入 P1048 采药01背包

P1048 [NOIP2005 普及组] 采药01背包

P1048 [NOIP2005 普及组] 采药(01背包 dp)

P1048 [NOIP2005 普及组] 采药(01背包 dp)

p1048洛谷P1048采药题解