1 solutions

  • 3
    @ 2024-3-19 23:14:11

    原先的想法是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;
    }
    

    所以看在我如此辛苦的份上,留下你的赞吧👍

    • @ 2024-6-13 13:23:03

      这题不都告诉你01背包了嘛?

      果断dp:

      #include<iostream>
      using namespace std;
      int f[int(2e4)];
      struct{int w;int c;}a[int(4e3)];
      int main(){
      	int n(0),m(0);
      	cin>>n>>m;
      	for(int i(1);i<=n;i++)
      		cin>>a[i].w>>a[i].c;
      	for(int i(1);i<=n;i++)
      		for(int j(m);j>0;j--)
      			if(j>=a[i].w)
      				f[j]=max(f[j],f[j-a[i].w]+a[i].c);
      	cout<<f[m];
      }
      

      01模板题,一遍过。

      样例都没试就AC了。

      题解不错,好评给了!

    • @ 2024-6-13 13:25:12

      嗯?代码没高亮?只能给你个绿色差评了。

  • 1

Information

ID
779
Time
1000ms
Memory
256MiB
Difficulty
7
Tags
# Submissions
75
Accepted
17
Uploaded By