这题唯一需要注意的地方就是:这提初始化方案数组 wa [] 的时候要把 0~m 都初始化为 1,因为我们求的背包的最优值不一定是要把背包给完全填满,有就行!!!
代码
#include<bits/stdc++.h>
using namespace std;#definedbdouble#definelllonglong#definePirpair<int,int>#definefifirst#definesesecond#definepbpush_back#definem_pmake_pair#defineinf0x3f3f3f3f#defineINF0x3f3f3f3f3f3f3f3f/*==========ACMer===========*/#defineintllconstint N =1005;constint mod =1e9+7;int f[N], wa[N];signedmain(){int n, m;scanf("%lld %lld",&n,&m);int v, w;for(int i =0; i <= m; i ++) wa[i]=1;//这里 0~m 的方案数都要初始化为 1 是因为我们的所求背包的最优值,不一定需要把背包给填满, 有就行!!!for(int i =1; i <= n; i ++){scanf("%lld %lld",&v,&w);for(int j = m; j >= v; j --){if(f[j]< f[j - v]+ w){
f[j]= f[j - v]+ w;
wa[j]= wa[j - v];}elseif(f[j]== f[j - v]+ w){
wa[j]=(wa[j]+ wa[j - v])% mod;}}}int mx =0;for(int i =0; i <= m; i ++){
mx =max(mx, f[i]);}int ans =0;for(int i =0; i <= m; i ++){if(f[i]== mx){
ans =max(ans, wa[i]);}}printf("%lld\n", ans);return0;}
思路这题唯一需要注意的地方就是:这提初始化方案数组 wa [] 的时候要把 0~m 都初始化为 1,因为我们求的背包的最优值不一定是要把背包给完全填满,有就行!!!代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#de.