当前位置 博文首页 > 爱新觉罗?炒饭的博客:01背包问题(经典动态规划)

    爱新觉罗?炒饭的博客:01背包问题(经典动态规划)

    作者:[db:作者] 时间:2021-07-07 15:35

    在这里插入图片描述
    解法一:二维数组

    #include<bits/stdc++.h>
    using namespace std;
    int dp[500][10000];//dp[i][j]表示前i个物品,背包容量是j的情况下的最大价值
    int v[10000];
    int w[10000];
    int main()
    {
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		cin>>w[i]>>v[i];
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=0;j<=m;j++)
    		{
    			dp[i][j]=dp[i-1][j];
    			if(j>=w[i])
    			  dp[i][j]=max(dp[i][j],dp[i-1][j-w[i]]+v[i]);
    		}
    	}
    	cout<<dp[n][m];
    	return 0;
    }
    

    解法二:一维数组,空间优化

    #include<iostream>
    using namespace std;
    const int N=10010;
    int f[N],w[N],v[N];
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>w[i]>>v[i];
        for(int i=1;i<=n;i++)
        {
        	for(int j=m;j>=w[i];j--)
            {
            	if(j>=w[i])
            	{
    			    f[j]=max(f[j],f[j-w[i]]+v[i]);
    			}
    		}
    	}
        cout<<f[m]<<endl;
        return 0;
    }
    
    cs