【题目来源】
http://acm.hdu.edu.cn/showproblem.php?pid=1712
【题目描述】
ACboy has N courses this term, and he plans to spend at most M days on study.Of course,the profit he will gain from different course depending on the days he spend on it.How to arrange the M days for the N courses to maximize the profit?
【输入格式】
The input consists of multiple data sets. A data set starts with a line containing two positive integers N and M, N is the number of courses, M is the days ACboy has.
Next follow a matrix A[i][j], (1<=i<=N<=100,1<=j<=M<=100).A[i][j] indicates if ACboy spend j days on ith course he will get profit of value A[i][j].
N = 0 and M = 0 ends the input.
【输出格式】
For each data set, your program should output a line which contains the number of the max profit ACboy will gain.
【算法分析】
题目大意:一个学生用 M 天的时间复习 N 门课程。已知花费在课程上的天数不同,将会有不同的收益。但是根据样例,并不是花费在课程上的天数越大,收益就越大。所以,请问如何安排这 M 天,可使得收益最大?
解题思路:本题本质上是一个分组背包问题。可将每门课看成一个分组,每门课选择花费的不同天数看成是分组中的不同物品。显然,每组只能选择一个天数。这是因为花费在某门课上的天数,不可能即是 X 天,同时又是 Y 天,只可能是单选。本题中组数为 N,背包容量为M。
分组背包问题求解的详细分析可参见:https://blog.csdn.net/hnjzsyjyj/article/details/126202821
【算法代码】
- #include
- using namespace std;
-
- const int maxn=105;
- int a[maxn][maxn];
- int c[maxn];
-
- int main() {
- int n,V;
- while(cin>>n>>V) {
- memset(c,0,sizeof(c));
-
- if(n==0&&V==0)break;
-
- for(int i=1; i<=n; i++) {
- for(int j=1; j<=V; j++) {
- cin>>a[i][j];
- }
- }
-
- for(int i=1; i<=n; i++) {
- for(int j=V; j>=1; j--) {
- for(int k=1; k<=j; k++) {
- if((c[j-k]+a[i][k])>c[j]) c[j]=c[j-k]+a[i][k];
- }
- }
- }
- cout<
- }
-
- return 0;
- }
-
-
- /*
- in:
- 2 2
- 1 2
- 1 3
- 2 2
- 2 1
- 2 1
- 2 3
- 3 2 1
- 3 2 1
- 0 0
- out:
- 3
- 4
- 6
- */
【参考文献】
http://acm.hdu.edu.cn/showproblem.php?pid=1712
https://blog.csdn.net/Runner__1/article/details/49849625
https://blog.csdn.net/hnjzsyjyj/article/details/126202821