E19 背包DP 求方案数

E19 背包DP 求方案数_哔哩哔哩_bilibili

 

U224067 背包问题求方案数 - 洛谷

U636783 背包九题-背包问题求方案数 - 洛谷

// 不超背包容量的方案数 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博客

 

posted @ 2023-04-10 10:04  董晓  阅读(776)  评论(0)    收藏  举报