洛谷月赛 T3

P8548 小挖的买花

@[Error_Eric](/user/217300) 呃,我没太理解为什么要初始化-inf
by Kniqht @ 2022-09-24 12:40:06


先贴一发已经 AC 的。 ```cpp #include<iostream> #include<algorithm> #include<stdio.h> using namespace std; void readln(int &I){ I=0;char C=getchar();bool f=0; while (!isdigit(C))f|=(C=='-'),C=getchar(); while ( isdigit(C))(I*=10)+=(C-'0'),C=getchar(); if(f)I=-I; } int n,q,cj,fj; int co[505],fr[505],w[505]; long long f[505][505],g[505][505]; const long long inf=0x3fffffffffffffff; int main(){ readln(n),readln(q); for(int i=1;i<=n;i++) readln(co[i]),readln(fr[i]),readln(w[i]); for(auto&fx:f)for(auto&fxx:fx)fxx=-inf; for(auto&gx:g)for(auto&gxx:gx)gxx=-inf; f[0][0]=0; for(int i=1;i<=n;i++){ for(int j=500;j>=co[i];j--){ for(int k=501+fr[i];k>=fr[i];k--){ f[j][min(501,k)]=max(f[j][min(501,k)],f[j-co[i]][k-fr[i]]+w[i]); } } } for(int i=0;i<=500;i++) for(int j=501;j>=0;j--) if(i==0)g[i][j]=max(f[i][j],g[i][j+1]); else g[i][j]=max(f[i][j],max(g[i-1][j],g[i][j+1])); while (q--) readln(cj),readln(fj),printf("%lld\n",max(g[cj][fj],0ll)); } ```
by Error_Eric @ 2022-09-24 12:40:24


@[qi136](/user/315205) 恰好背包是要初始化 -inf 的。 例如一个商品价格是 $3$,价值是 $4$,你初始 $f[2]$ 是 $0$ , $f[5]$ 可能会被赋值为 $4$。
by Error_Eric @ 2022-09-24 12:41:46


@[Error_Eric](/user/217300) 哦,明白了
by Kniqht @ 2022-09-24 12:42:30


@[ETO_leader](/user/388691) 我没有看出来你的做法是啥。请仔细阅读题意。
by Error_Eric @ 2022-09-24 12:46:31


剩下的人已经私信回了。
by Error_Eric @ 2022-09-24 12:46:51


@[Error_Eric](/user/217300) 蟹蟹 DL
by JackMerryYoung @ 2022-09-24 12:50:48


```cpp #include "iostream" using namespace std; #include "cmath" struct flu { int cost,be,fr; }s[503]; int n,m; int be,sfre,scost,maxbe,ccost,cfre; void dfs(int i,int cost,int fre) { if((s[i].cost+scost>cost)||i>n-1) { if(sfre>=fre) { maxbe=max(maxbe,be); } return; } if(s[i].cost+scost<cost) { scost+=s[i].cost, be+=s[i].be, sfre+=s[i].fr, dfs(i+1,cost,fre), scost-=s[i].cost, be-=s[i].be; sfre-=s[i].fr; } dfs(i+1,cost,fre); } int main() { cin>>n>>m; for(int i=0;i<n;i++) cin>>s[i].cost>>s[i].fr>>s[i].be; for(int i=0;i<m;i++) { cin>>ccost>>cfre; be=0,sfre=0,scost=0,maxbe=0; dfs(0,ccost,cfre); cout<<maxbe<<endl; } }//求助为啥dfs不行(能过样例 ```
by isxi @ 2022-09-24 12:53:56


@[AKimizuss](/user/681982) 别问了,正解不香吗...
by JackMerryYoung @ 2022-09-24 12:58:22


dp求看 ```cpp #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 510; int n, q; int cst, be, fr; int dp[N][N]; int main(){ // memset(dp, -0x3f, sizeof dp); scanf("%d%d", &n, &q); for(int i = 1; i <= n; ++ i){ scanf("%d%d%d", &cst, &fr, &be); for(int j = 500; j >= 0; -- j){ for(int k = 500; k >= 0; -- k){ if(j - cst >= 0 && k - fr > 0){ dp[j][k] = max(dp[j][k], dp[j - cst][k - fr] + be); dp[j][k] = max(dp[j][k], dp[j][k + 1]); } else if(j - cst >= 0 && k - fr <= 0) { dp[j][k] = max(dp[j][k], dp[j - cst][0] + be); dp[j][k] = max(dp[j][k], dp[j][k + 1]); } } } } for (int i = 1; i <= 500; i++) { for (int j = 500; j >= 0; j--) dp[i][j] = max(dp[i][j], dp[i][j + 1]); } for(int i = 1; i <= q; ++ i){ int a, b; scanf("%d%d", &a, &b); printf("%d\n", dp[a][b]); } } ```
by aaaaaaaawsl @ 2022-09-24 13:05:27


上一页 | 下一页