3 solutions

  • 1
    @ 2025-1-20 10:36:26
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010,M=1010;
    const int P=1e9+7;
    int f[M],g[M];
    //f[j]=t 表示背包体积恰好为j的最大价值是t,
    //g[j]=k 表示背包体积恰好是j且最大价值恰好是t的方案数为k
    int v[N],w[N];
    int main()
    {
        int n,V;
        cin>>n>>V;
        memset(f,-0x3f,sizeof f);//状态不合法
        f[0]=0;//初始状态
        g[0]=1;
        for(int i=1;i<=n;i++)
        {
            cin>>v[i]>>w[i];
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=V;j>=v[i];j--)
            {
                int t=max(f[j],f[j-v[i]]+w[i]); //得到当前最大值
                int cnt=0; //方案总数
                if(t==f[j]) cnt+=g[j]; //不选当前物品
                if(t==f[j-v[i]]+w[i]) cnt+=g[j-v[i]]; //选择当前物品
                f[j]=t; //记录最大值
                g[j]=cnt%P; //记录方案
            }
        }
        int res=0;
        for(int i=0;i<=V;i++) //枚举所有体积找到最大价值
        {
            res=max(res,f[i]);
        }
        int cnt=0;
        for(int i=0;i<=V;i++) //找到所有等于最大价值的方案
        {
            if(res==f[i])
            {
                cnt=(cnt+g[i])%P;
            }
        }
        cout<<cnt;
        return 0;
    }
    
    • -1
      @ 2025-1-20 9:39:09
      #include<bits/stdc++.h>
      using namespace std;
      int n,m,f[10020],v,w,a[10020],res,cnt,k; 
      int main()
      {
      	cin>>n>>m;
      	a[0]=1;
      	for(int i=1;i<=n;i++)
      	{
      		cin>>v>>w;
      		for(int j=m;j>=v;j--)
      		{
      			if(f[j]<f[j-v]+w)
      			{
      				k=a[j-v];
      				f[j]=f[j-v]+w;
      			}
      			else if(f[j]==f[j-v]+w)
      			{
      				k=a[j]+a[j-v];
      				f[j]=f[j];
      			}
      			else
      			{
      				k=a[j];
      				f[j]=f[j];
      			}
      			a[j]=k%1000000007;
      		}
      	}
      	for(int i=1;i<=m;i++)
      	{
      		res=max(res,f[i]);
      	}
      	for(int i=1;i<=m;i++)
      	{
      		if(f[i]==res)
      		{
      			cnt=(cnt+a[i])%1000000007;
      		}
      	}
      	cout<<cnt;
      	return 0;
      }
      • -1
        @ 2025-1-20 9:38:01
        #include<bits/stdc++.h>
        using namespace std;
        int n,m,f[10020],v,w,a[10020],res,cnt,k; 
        int main()
        {
        	cin>>n>>m;
        	a[0]=1;
        	for(int i=1;i<=n;i++)
        	{
        		cin>>v>>w;
        		for(int j=m;j>=v;j--)
        		{
        			if(f[j]<f[j-v]+w)
        			{
        				k=a[j-v];
        				f[j]=f[j-v]+w;
        			}
        			else if(f[j]==f[j-v]+w)
        			{
        				k=a[j]+a[j-v];
        				f[j]=f[j];
        			}
        			else
        			{
        				k=a[j];
        				f[j]=f[j];
        			}
        			a[j]=k%1000000007;
        		}
        	}
        	for(int i=1;i<=m;i++)
        	{
        		res=max(res,f[i]);
        	}
        	for(int i=1;i<=m;i++)
        	{
        		if(f[i]==res)
        		{
        			cnt=(cnt+a[i])%1000000007;
        		}
        	}
        	cout<<cnt;
        	return 0;
        }
        
        
        • 1

        Information

        ID
        213
        Time
        1000ms
        Memory
        256MiB
        Difficulty
        5
        Tags
        # Submissions
        35
        Accepted
        8
        Uploaded By