题目描述:
blablablablablablablablablabla 传送门
算法思想:
核心:
这个我们可以直接将它看成01
背包来解决。即若有k
件a
种物品,则把它拆成k
个相同的物品,用for
循环来枚举a
物品取多少个(k)
状态表示:
f[i][j]
表示前i
件物品,当背包容量为j
时的最大价值
状态转移:
f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i])
注意判断k<=s[i] && k*v[i]<=j
时间复杂度
O ( n ∗ m ∗ l o g n ) O(n*m*log^n) O(n∗m∗logn)
代码实现:
#include <iostream>
using namespace std;
int m,n;
int f[101][101];
int v[101];
int s[101];
int w[101];
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i]>>s[i];
for(int j=0;j<=m;j++)
{
for(int k=0;k<=s[i] && k*v[i]<=j;k++)
{
f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
}
}
}
cout<<f[n][m];
return 0;
}
ccwnb!!!!