题意
GG翻译
ACboy有这个学期的N门课程,他计划最多花费M天时间学习。当然,他将从不同的课程中获得的利润取决于他花费的时间。如何安排N门课程的M天利润最大化?
输入由多个数据集组成。数据集以包含两个正整数N和M的行开始,N是课程数,M是ACboy所具有的日子。接下来是矩阵A [i] [j],(1 <= i <= N <= 100,1 <= j <= M <= 100).A [i] [j]表示ACboy是否花了j天当然,他将获得价值A [i] [j]的利润。 N = 0和M = 0结束输入。
分组背包的入门题目
我们考虑将时间作为背包容量, 将每个一个课程所要花费的时间当做背包的分组, 这样 我们就是要选择每一组中间 最优的策略
这个题明显就是有n组物品,每组物品有v个选择v天
三重循环分别表示着
第一重 n个分组 第二重 背包的容量 第三组 每个背包的个数,保证了每组物品选择用一个
状态
dp[k,v]
d
p
[
k
,
v
]
表示前
k
k
组物品花费费用所能取得的最大价值
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e2+10;
int dp[MAXN];
int arr[MAXN][MAXN];
int n, v;
int main(int argc, char const *argv[])
{
while(cin >> n >> v,n|v) {
memset(dp, 0, sizeof dp);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= v; j++) {
cin >> arr[i][j];
}
}
for(int i = 1; i <= n; i++) { //物品有n组
for(int j = v; j >= 0; j--) { // V的容量
for(int k = 1; k <= v; k++) { // 第i组 每组物品可以有v个
if(j >= k)
dp[j] = max(dp[j], dp[j-k]+arr[i][k]);
}
}
}
cout << dp[v] <<endl;
}
return 0;
}