题目
题解思路
在求最大值的过程中 附加求方案数的dp 即可
由于定义是使用至多 M 体积 达到的最大值 所以在 M 体积之前可能也存在最优方案 所以要往回循环判断一次
AC代码
//一维写法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7 ;
int f[1010];
int cnt[1010];
int v[1010] , w[1010] ;
int main ()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for (int i = 1 ; i <= n ; i++ )
{
cin>>v[i]>>w[i];
}
cnt[0] = 1 ;
for (int i = 1 ;i <= n ; i++ )
{
for (int j = m ; j >= v[i] ; j-- )
{
int tmp = max( f[j] , f[j-v[i]] + w[i] );
if ( f[j] > f[j-v[i]] + w[i] )
cnt[j] = ( cnt[j] ) % mod ;
else if ( f[j] < f[j-v[i]] + w[i])
cnt[j] = ( cnt[j-v[i]] ) % mod ;
else
cnt[j] = (cnt[j] + cnt[j-v[i]] ) % mod ;
f[j] = tmp;
}
}
for (int i = m -1 ; i >= 0 ; i-- )
if ( f[i] == f[m] )
cnt[m] = ( cnt[i] + cnt[m] ) % mod ;
cout<<cnt[m]<<"\n";
return 0 ;
}
//二维写法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7 ;
int f[1010][1010];
int cnt[1010][1010];
int v[1010] , w[1010] ;
int main ()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for (int i = 1 ; i <= n ; i++ )
{
cin>>v[i]>>w[i];
}
cnt[0][0] = 1 ;
for (int i = 1 ;i <= n ; i++ )
{
for (int j = m ; j >= 0 ; j-- )
{
f[i][j] = f[i-1][j] ;
if ( j >= v[i] )
{
f[i][j] = max( f[i][j] , f[i-1][j-v[i]] + w[i] );
if ( f[i-1][j] > f[i-1][j-v[i]] + w[i] )
cnt[i][j] = ( cnt[i-1][j] + cnt[i][j] ) % mod ;
else if ( f[i-1][j] < f[i-1][j-v[i]] + w[i])
cnt[i][j] = ( cnt[i-1][j-v[i]] + cnt[i][j] ) % mod ;
else
cnt[i][j] = (cnt[i-1][j] + cnt[i-1][j-v[i]] + cnt[i][j] ) % mod ;
}else
cnt[i][j] = ( cnt[i-1][j] + cnt[i][j] ) % mod ;
}
}
for (int i = m -1 ; i >= 0 ; i-- )
if ( f[n][i] == f[n][m] )
cnt[n][m] = ( cnt[n][i] + cnt[n][m] ) % mod ;
cout<<cnt[n][m]<<"\n";
return 0 ;
}
作者:陈末
链接:https://www.acwing.com/activity/content/code/content/1802419/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。