原题链接:https://www.acwing.com/problem/content/4/
算法标签:动态规划、01背包
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int dp[109][109];
int main(){
int n,m;
int v[109],w[109], num[109];
cin >> n >> m;
for( int i=1; i<=n; i++ ){
cin >> v[i] >> w[i] >> num[i];
}
for( int i=1; i<=n; i++ ){
for( int j=1; j<=m; j++ ){
dp[i][j] = dp[i-1][j];
for( int k=1; k<=num[i] && k*v[i]<=j; k++ ){
dp[i][j] = max(dp[i][j], dp[i-1][j-k*v[i]] + k*w[i]);
}
}
}
cout << dp[n][m];
return 0;
}
空间优化:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int dp[109], v[109], w[109],s[109];
int main(){
cin >> n >> m;
for( int i=1; i<=n; i++ ){
cin >> v[i] >> w[i] >> s[i];
}
for( int i=1; i<=n; i++ ){
for( int j=m; j>=1; j-- ){
for( int k=1; k<=s[i] && k*v[i]<=j; k++ ){
dp[j] = max( dp[j], dp[j-k*v[i]] + k*w[i] );
}
}
}
cout << dp[m];
return 0;
}