3 条题解

  • 5
    @ 2022-12-11 18:39:34
    #include <bits/stdc++.h>
    using namespace std;
    int m,total;//m:件数,total:总金额 
    int zw[40000],zv[40000];//主件金额,主件价值(金额*重要度) 
    int fw[40000][4],fv[40000][3];//附件金额,附件价值 
    int dp[40000],v,p,q;//dp:存储在i件物品的背包容量为j的情况下的最大价值 
    int main(){
    	int i,j;
    	cin>>total>>m;
    	//循环m件物品 
    	for(i = 1;i <= m;i++){
    		cin>>v>>p>>q;
    		//如果是主件 
    		if(q == 0){
    			zw[i] = v;//价格 
    			zv[i] = v * p;//价值度(价格*重要) 
    		}else{
    			//第q个物品的附件个数 
    			fw[q][0]++;
    			fw[q][fw[q][0]]=v;//第几个主件的价格
    			fv[q][fw[q][0]]=v*p;//附件价值(价格*重要) 
    		} 
    	}
    	//循环m个物品
    	for(i = 1;i <= m;i++){
    		//按背包的逻辑循环从总价格开始循环到每个主件的价格 
    		for(j = total;j >= zw[i];j--){
    			//在能装下这个物品的情况下,讨论:只要主件,主件+附件1,主件+附件2,主件+附件12
    			//情况1:只要主件
    			dp[j] = max(dp[j],dp[j-zw[i]]+zv[i]);
    			//情况2:主件+附件1
    			if(j>=zw[i]+fw[i][1]) dp[j]=max(dp[j],dp[j-zw[i]-fw[i][1]]+zv[i]+fv[i][1]);
    			//情况3:主件+附件2
    			if(j>=zw[i]+fw[i][2]) dp[j]=max(dp[j],dp[j-zw[i]-fw[i][2]]+zv[i]+fv[i][2]);
    			//情况4:主件+附件12
    			if(j>=zw[i]+fw[i][1]+fw[i][2]) 
    			 dp[j]=max(dp[j],dp[j-zw[i]-fw[i][1]-fw[i][2]]+zv[i]+fv[i][1]+fv[i][2]);
    		}
    	} 
    	cout<<dp[total];
    	return 0;
    }
    
    • 1
      @ 2023-6-6 23:05:12
      #include<bits/stdc++.h>
      using namespace std;
      int n,m,f[32007],v[70][4],w[70][4],num[70];
      int main()
      {
          cin>>n>>m;
          for (int i=1;i<=m;i++)
          {
              int v1,p,q;
              cin>>v1>>p>>q;
              if (q>0)
                  v[q][++num[q]]=v1,w[q][num[q]]=v1*p;
              else
                  v[i][0]=v1,w[i][0]=v1*p;
          }
          for (int i=1;i<=m;i++)
              for (int j=n;j>=v[i][0];j--)
              {
                  f[j]=max(f[j],f[j-v[i][0]]+w[i][0]);
                  if (j>=v[i][0]+v[i][1])
                      f[j]=max(f[j],f[j-v[i][0]-v[i][1]]+w[i][0]+w[i][1]);
                  if (j>=v[i][0]+v[i][2])
                      f[j]=max(f[j],f[j-v[i][0]-v[i][2]]+w[i][0]+w[i][2]);
                  if (j>=v[i][0]+v[i][1]+v[i][2])
                      f[j]=max(f[j],f[j-v[i][0]-v[i][1]-v[i][2]]+w[i][0]+w[i][1]+w[i][2]);
              }
          cout<<f[n];
          return 0;
      }
      • 0
        @ 2022-4-24 18:59:34

        写题解请注意

        鼓励大家写题解,但注意题解格式。

        题解一定要有思路解析或代码注释,能否让别人理解你的思路

        也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

        给代码两端加上这个会舒服一些

        ```cpp

        你的代码

        ```

        </span>

        这个点在键盘的左上角tab上面那个键,注意切换输入法

        #include<iostream>
        using namespace std;
        int main()
        {
            int n;
            cin>>n;//这是一个注释
            return 0;
        } 
        

        请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

        抄袭题解一经发现直接取消成绩。

        题解被删除的可能

        1. 代码不符合格式规范
        2. 没有思路讲解或者没有注释,
        3. 无意义的题解

        大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

        • 1

        信息

        ID
        816
        时间
        1000ms
        内存
        128MiB
        难度
        3
        标签
        递交数
        51
        已通过
        27
        上传者