1 solutions
-
3
原先的想法是DFS递归求答案,但是军舰改数据了,DFS只有70分,代码如下:
#include<bits/stdc++.h> using namespace std; int n,m; int w[10005],c[10005]; int dp[10005][10005]={}; int dfs(int i,int sp){ if(i==0||sp==0) return 0; if(dp[i][sp]) return dp[i][sp]; if(w[i-1]>sp)dp[i][sp]=dfs(i-1,sp); else dp[i][sp]=max(dfs(i-1,sp),dfs(i-1,sp-w[i-1])+c[i-1]); return dp[i][sp]; } int main(){ cin>>n>>m; for(int i=0;i<n;i++) cin>>w[i]>>c[i]; cout<<dfs(n,m)<<"\n"; return 0; }
还是那个套路,记忆化。 于是我痛定思痛终于决定了用dp! 然鹅。。。反复提交修改了十多次都是50ac! 终于发现只是输入问题 这里体现了打代码速度是O(n^2) 修一个bug的时间复杂度是O(n^n) 😕
#define ll long long #include<bits/stdc++.h> using namespace std; int m,n; int w[10005],c[10005]; int main(){ cin>>n>>m; for(int i=0;i<n;i++) cin>>w[i]>>c[i]; vector<vector<int> > dp(n+1,vector<int>(m+1,0)); for(int i=1;i<=n;i++){ for(int C=1;C<=m;C++){ if(w[i-1]>C) dp[i][C]=dp[i-1][C]; else dp[i][C]=max(dp[i-1][C],dp[i-1][C-w[i-1]]+c[i-1]); } } cout<<dp[n][m]<<'\n'; return 0; }
所以看在我如此辛苦的份上,留下你的赞吧👍
- 1
Information
- ID
- 779
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 75
- Accepted
- 17
- Uploaded By