84分求助(dfs)

P2677 [USACO07DEC] Bookshelf 2 B

诶不是我没写return ```cpp #include<bits/stdc++.h> using namespace std; int n,b; int h[25]; int minn=100; void dfs(int ans,int cnt,int tall) { if(ans==n) { if(tall>=b) { minn=min(minn,tall-b); return; } } for(int i=ans+1;i<=n;i++) { dfs(i,0,tall); dfs(i,1,tall+h[i]); } } int main() { cin>>n>>b; for(int i=1;i<=n;i++) { cin>>h[i]; } dfs(0,0,0); cout<<minn; return 0; } ```
by shooting__star @ 2024-02-28 21:53:16


@[shooting__star](/user/955954) dp,你值得拥有
by taoyiwei17_cfynry @ 2024-02-28 21:55:13


@[shooting__star](/user/955954) ```cpp #include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,b,w,h[N],sum,dp[N]; int main() { cin>>n>>b; for(int i=1;i<=n;i++) { cin>>h[i]; sum+=h[i]; } w=sum-b; for(int i=1;i<=n;i++) { for(int j=w;j>=h[i];j--) { dp[j]=max(dp[j],dp[j-h[i]]+h[i]); } } cout<<w-dp[w]; return 0; }
by taoyiwei17_cfynry @ 2024-02-28 21:55:22


@[shooting__star](/user/955954) 不明白你 dfs 里的参数 cnt 是干嘛的
by ljlbj_fengyuwuzu @ 2024-02-28 21:57:35


@[shooting__star](/user/955954) 稍稍改动了一些地方,把 dfs 里面的 for 循环去掉了。为啥要写 for 啊。 ```cpp #include<bits/stdc++.h> using namespace std; int n,b; int h[25]; int minn=100; void dfs(int ans,int cnt,int tall) { if(ans==n) { if(tall>=b) { minn=min(minn,tall-b); } return; } dfs(ans + 1,0,tall); dfs(ans + 1,1,tall+h[ans + 1]); } int main() { cin>>n>>b; for(int i=1;i<=n;i++) { cin>>h[i]; } dfs(0,0,0); cout<<minn; return 0; } ```
by ljlbj_fengyuwuzu @ 2024-02-28 22:00:28


在 for 里考虑不选的情况会状态重复啊……
by MrPython @ 2024-02-28 22:04:06


```cpp void dfs(int ans,int cnt,int tall) { if(ans==n) { if(tall>=b) { minn=min(minn,tall-b); } return; } dfs(ans+1,0,tall); for(int i=ans+1;i<=n;i++) { dfs(i,1,tall+h[i]); } } ```
by MrPython @ 2024-02-28 22:09:47


@[shooting__star](/user/955954) 你的return也不应该在这里写
by MrPython @ 2024-02-28 22:10:07


AC。此帖结。
by shooting__star @ 2024-02-28 22:39:43


|