2 solutions

  • 0
    @ 2025-2-24 16:11:54

    #include using namespace std; int dp[105][20005]; int main(){ int maxw, n; cin >> maxw >> n; //处理dp边界值 //0件物品时,n=0 for(int i = 0; i <= maxw; i++){ dp[0][i] = 0; } //0的重量 for(int j = 0; j <= n; j++){ dp[j][0] = 0; }

    //n件物品 
    for(int i = 1; i <= n; i++){
    	int w, p;
    	cin >> w >> p;
    	for(int j = 1; j <= maxw; j++){
    		if(j < w) dp[i][j] = dp[i - 1][j];
    		else dp[i][j] = max(dp[i -1][j], dp[i - 1][j - w] + p);
    	}
    }
    cout << dp[n][maxw];
    return 0;
    

    }

    • 0
      @ 2023-3-1 21:07:18

      i为当前遍历到的物品编号,j为背包容量。 分能放和不能放两种情况

      状态转移方程:

      //如果能放
      dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+p[i]);
      //如果不能放
      dp[i][j]=dp[i-1][j];
      
      #include<iostream>
      #include<algorithm>
      #include<cstring>
      using namespace std;
      int dp[128][20002];
      int maxw,n,caw=0,cap=0;
      int w[128],p[128];
      int main()
      {
      	memset(dp,0,sizeof(dp));
      	cin>>maxw>>n;
      	for(int i=1;i<=n;i++)
      	{
      		cin>>w[i]>>p[i];
      		for(int j=1;j<=maxw;j++)
      		{
      			if(w[i]<=j)
      			{
      				dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+p[i]);
      			}
      			else
      			{
      				dp[i][j]=dp[i-1][j];
      			}
      		}
      	}
      	cout<<dp[n][maxw];
      }
      
      • 1

      Information

      ID
      620
      Time
      1000ms
      Memory
      64MiB
      Difficulty
      8
      Tags
      # Submissions
      119
      Accepted
      21
      Uploaded By