题解
【基础】背包问题求方案数
1 条题解
-
0
#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