m 的时间,一共 n 门课程,每门课程花不同时间得到的值不同,求能获得的最大值。
用分组背包,n 门课看成 n 组物品,每个物品所花费的时间为背包容量。
分组背包:
for(int i=1; i<=n; i++) // i 组物品
for(int j=V; j>=0; j--) // 容量为 j 时
for(int k=1; k<=c[i]; k++) // 第 i 组物品中放哪个(或者不放)
dp[j] = max(dp[j], dp[j-w[k]] + v[k]);
代码:
#include <iostream> #include <cstring> using namespace std; const int MAX = 105; int dp[MAX]; int v[MAX][MAX]; //第 i 组物品,重量为 j 时的价值 int n, m; int main(){ //freopen("input.txt", "r", stdin); while(cin >> n >> m && n + m != 0){ for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ cin >> v[i][j]; } } //分组背包 memset(dp, 0, sizeof(dp)); for(int i=1; i<=n; i++){ for(int j=m; j>=0; j--){ for(int k=1; k<=m; k++){ if(j >= k) dp[j] = max(dp[j], dp[j-k] + v[i][k]); } } } cout << dp[m] << endl; } return 0; }