题目
题解思路
在01背包的基础上 加入了几个情况的选择决策
循环对于每个物品 每种体积对应的最优决策即可(在每个体积下循环对应的决策取max)
AC代码
一维写法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
int f[110];
int v[110] , w[110] ;
int main ()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for (int i = 1 ; i <= n ; i++ )
{
int s;
cin>>s;
for (int j = 1 ; j <= s ; j++ )
cin>>v[j]>>w[j];
for (int j = m ; j >= 1 ; j-- )
{
for (int k = 1 ; k <= s ; k++ )
{
if ( j >= v[k] )
f[j] = max( f[j] , f[j - v[k]] + w[k]) ;
}
}
}
cout<<f[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;
int f[110][110];
int v[110] , w[110] ;
int main ()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for (int i = 1 ; i <= n ; i++ )
{
int s;
cin>>s;
for (int j = 1 ; j <= s ; j++ )
cin>>v[j]>>w[j];
for (int j = 1 ; j <= m ; j++ )
{
f[i][j] = f[i-1][j];
for (int k = 1 ; k <= s ; k++ )
{
if ( j >= v[k] )
f[i][j] = max( f[i][j] , f[i-1][j - v[k]] + w[k]) ;
}
}
}
cout<<f[n][m]<<"\n";
return 0 ;
}