4 条题解

  • 1
    @ 2024-5-23 20:54:54
    #include <bits/stdc++.h>
    using namespace std;
    const int N=20000;
    long long v[N],w[N],dp[1010],s[N],n,m,vi,wi,si,k=0;
    int main(){
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		cin>>vi>>wi>>si;
    		if(si>0){
    			int t=1;
    			while(t<=si){
    				k++;
    				w[k]=t*wi;
    				v[k]=t*vi;
    				s[k]=-1;
    				si-=t;
    				t*=2;
    			}
    			if(si>0){
    				k++;
    				w[k]=si*wi;
    				v[k]=si*vi;
    				s[k]=-1;
    			}
    		}else{
    			k++;
    			w[k]=wi;
    			v[k]=vi;
    			s[k]=si;
    		}
    	}
    	for(int i=1;i<=k;i++){
    		if(s[i]==-1){
    			for(int j=m;j>=v[i];j--){
    				dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
    			}
    		}else{
    			for(int j=v[i];j<=m;j++){
    				dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
    			}
    		}
    	}
    	cout<<dp[m];
    	return 0;
    }
    
    
    • -1
      @ 2022-4-24 19:00:48

      写题解请注意

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

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

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

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

      ```cpp

      你的代码

      ```

      </span>

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

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

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

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

      题解被删除的可能

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

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

      • -2
        @ 2022-1-17 20:40:20
        
        /*
        可以当多重背包做
        无限次最多也就取1000次
        所以无限次个数可以直接定义成1000去二进制优化 
        */ 
        #include<bits/stdc++.h>
        using namespace std;
        int N,V,v[100005],w[100005],f[1005],v1,w1,m1,cnt;
        int main()
        {
        	ios::sync_with_stdio(false);
        	cin.tie(0);
        	cin>>N>>V;
        	for(int i=1;i<=N;i++)
        	{
        		cin>>v1>>w1>>m1;//体积,价值,个数 
        		if(m1==-1) m1=1;//看一次就设成1 
        		if(m1==0) m1=1024;
        		int c=1;//从1开始 
        		while(m1-c>0)//能拆就一直拆 
        		{
        			m1-=c;
        			v[++cnt]=c*v1;
        			w[cnt]=c*w1;
        			c*=2;//每拆一次去乘以2 
        		} 
        		v[++cnt]=m1*v1;//拆不动了剩下的单独拿一组 
        		w[cnt]=m1*w1;
        	}
        	for(int i=1;i<=cnt;i++)//一共cnt个物品做01背包 
        	{
        		for(int j=V;j>=v[i];j--)
        		{
        			f[j]=max(f[j],f[j-v[i]]+w[i]);
        		}
        	}
        	cout<<f[V];
            return 0;
        }
        • -3
          @ 2022-4-19 22:30:00

          严禁抄题解,发现后取消成绩

          • 1

          信息

          ID
          901
          时间
          1000ms
          内存
          128MiB
          难度
          3
          标签
          递交数
          21
          已通过
          18
          上传者