1 条题解

  • 0
    @ 2023-6-11 12:22:25

    C :

    #include<stdio.h>
    #define max(a,b)	(a>b?a:b)
    int n,m;
    long long f[100000];
    int main()
    {
    	scanf("%d %d",&n,&m);
    	for(int i=1;i<=n;i++)
    	{
    		int w,v,s;
    		scanf("%d %d %d",&w,&v,&s);
    		for(int j=m;j>=0;j--)
    		for(int t=1;t*w<=j&&t<=s;t++)
    		f[j]=max(f[j],f[j-w*t]+v*t);
    	}
    	printf("%lld",f[m]);
    	return 0;
    }
    

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    //由于要将物品拆分 
    int f[2020],v[15050],w[15050];
    int op = 0;
    int main() {
    	//二进制优化 
    	//7:表示为0~7的和
    	//7分为:1 1 1 1 1 1 1,将7件物品分为7种物品 
    	//二进制分法:2^2+2^1+2^0
    	//凑出一个整数Si的时间复杂度:log2(Si)
    	
    	/*
    	  如果要凑一个整数10
    	  理论上需要log2(10)=4个数
    	  但4个数1 2 4 8,不过会多凑一些数出来
    	  但其实需要的数是: 1 2 4 3就能凑出0~10
    	  也就是说:2^p是<=Si 2^p+1 > Si,求出一个p
    	    这个p就是需要的数的数量
    		需要的最后一个数 = Si - (2^0+2^1+...+2^p) 
    	*/ 
    	int n,m;
    	cin>>n>>m;
    	//拆分物品 
    	for(int i = 1;i <= n;i++){
    		int v1,w1,s;
    		cin>>v1>>w1>>s;
    		int k = 1;//k代表2的幂 
    		while(k <= s){
    			v[++op] = v1 * k;
    			w[op] = w1 * k; 
    			s -= k;
    			k *= 2;
    		} 
    		//如果s还有值,说明s不是正好是2的整数次方 
    		if(s){
    			v[++op] = v1 * s;
    			w[op] = w1 * s;
    		}
    	}
    	
    	//转换为01背包
    	for(int i = 1;i <= op;i++){
    		for(int j = m;j >= v[i];j--){
    			f[j] = max(f[j],f[j-v[i]]+w[i]); 
    		}
    	} 
    	
    	cout<<f[m];
    	 
    	return 0;
    }
    
    
    • 1

    信息

    ID
    2759
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    9
    已通过
    1
    上传者