求助 30pts 部分分 dfs

P1048 [NOIP2005 普及组] 采药

@[Dream_Loner](/user/238711) 这题正解是背包吧
by Polaris_flame @ 2023-08-14 18:43:33


@[Polaris_flame](/user/1046448) 是,但是我在练 dfs 部分分,但我现在 0 pts
by Dream_Loner @ 2023-08-14 18:44:16


@[Dream_Loner](/user/238711) 这道题直接纯dfs就好了,直接递归,然后随便加个剪枝(记忆)就能过。
by da_ke @ 2023-08-14 20:04:33


dp!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ```cpp #include <bits/stdc++.h> using namespace std; int a[1010], b[110], c[110]; int main(){ int n, t; cin>>t>>n; for (int i = 1;i<=n;i++){ cin>>b[i]>>c[i]; } for (int i = 1;i<=n;i++){ for (int j = t;j>=b[i];j--){ a[j] = max(a[j],a[j-b[i]]+c[i]); } } cout<<a[t]; return 0; } ```
by Tx1234567 @ 2023-08-18 08:36:35


这题正解是背包,别的解得是大犇才能解出来 DP代码如下 ``` #include<bits/stdc++.h> using namespace std; const int N=110,M=1010; int n,m,dp[N][M]; int v[N],w[N]; int main(){ cin>>m>>n; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++){ dp[i][j]=dp[i-1][j]; if(j>=v[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]); } cout<<dp[n][m]; return 0; } ```
by Ethan216 @ 2023-08-18 10:30:29


@[Dream_Loner](/user/238711) 这是我的程序。如果要 AC 的话需要加记忆化了 ```cpp ll dfs(int u, int k){ if(u <= 0 || k > m) return 0; if(u < a[k].w) return dfs(u, k + 1); ll sel = dfs(u - a[k].w, k + 1) + a[k].v, unsel = dfs(u, k + 1); return max(sel, unsel); } // main 函数 cin >> t >> m; for(int i = 1; i <= m; i++){ cin >> a[i].w >> a[i].v; } cout << dfs(t, 1); ```
by PanDaoxi @ 2023-09-03 22:33:56


|