E19 背包DP 求方案数
// 不超背包容量的方案数 O(n*m) #include<bits/stdc++.h> using namespace std; const int N=1010,M=1e9+7; int n,m,v,w; int f[N]; //f[j]表示背包容量为j时的最大价值 int g[N]; //g[j]表示背包容量为j时的方案数 int main(){ scanf("%d%d",&n,&m); for(int i=0;i<=m;i++) g[i]=1; //每个容量的方案初值均为1 for(int i=1;i<=n;i++){ scanf("%d%d",&v,&w); for(int j=m;j>=v;j--){ if(f[j-v]+w>f[j]){ //装物品i价值更大, f[j]=f[j-v]+w; //更新价值, g[j]=g[j-v]; //继承方案数 } else if(f[j-v]+w==f[j]){ //装物品i价值相等, g[j]=(g[j]+g[j-v])%M; //更新方案数 } } } printf("%d\n",g[m]); }
// 恰好装满的方案数 O(n*m) #include<bits/stdc++.h> using namespace std; const int N=1010,M=1e9+7; int n,m,v,w; int f[N]; //f[j]表示背包容量为j时的最大价值 int g[N]; //g[j]表示背包容量为j时的方案数 int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) f[i]=-10000; f[0]=0,g[0]=1; //初值不同 for(int i=1;i<=n;i++){ scanf("%d%d",&v,&w); for(int j=m;j>=v;j--){ if(f[j-v]+w>f[j]){ f[j]=f[j-v]+w; g[j]=g[j-v]; } else if(f[j-v]+w==f[j]){ g[j]=(g[j]+g[j-v])%M; } } } printf("%d\n",g[m]); }
背包九讲——背包问题求方案数_1.给定n种物品和一个背包。物品i的重量是w[i],其价值为v[i],背包的容量为c。应如-CSDN博客
浙公网安备 33010602011771号