主要是集合如何划分
(1)一般原则:不重不漏,不重不一定都要满足(一般求个数时要满足).
(2)如何将现有的集合划分为更小的子集,使得所有子集都可以计算出来.
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> v[i] >> w[i];
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= m; 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]);
}
}
}
for(int i = 1 ; i<=n ;i++)
for(int j = v[i] ; j<=m ;j++)
{
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
while(n--)
{
cin>>w>>v>>s;
while(s--)
for(int j=t;j>=w;j--)
dp[j]=max(dp[j],dp[j-w]+v);
}
cout<<dp[t];