top1编程
← 返回题目
题解

【基础】背包问题求方案数

1 条题解

  • 0
    @ 2026-7-29 0:18:13
    #include<iostream>
    using namespace std;
    const int mod=1e9+7;
    int n,m;
    int v[1005],w[1005];
    int f[1005],c[1005];
    //f[i]表示背包容量为i时所获得最大价值,c[i]表示背包容量为i时的方案数
    int main(){
        cin>>n>>m;
        for(int i=0;i<=m;i++){
            c[i]=1;//什么也不选,自己也是一种方案
        }
        for(int i=1;i<=n;i++){
            cin>>v[i]>>w[i];
        }
        for(int i=1;i<=n;i++){
            for(int j=m;j>=v[i];j--){
                if(f[j]<f[j-v[i]]+w[i]){//如果选第i件物品价值更大,那就选择,此时价值改变,方案数不变
                    f[j]=f[j-v[i]]+w[i];
                    c[j]=c[j-v[i]];
                }else if(f[j]==f[j-v[i]]+w[i]){//如果价值相等,获得此价值相对又多了一种方案,方案数相加
                    c[j]=(c[j]+c[j-v[i]])%mod;
                }
            }
        }
        cout<<c[m]<<endl;
        return 0;
    }
    
    • 1