【HDU1712】ACboy needs your help(分组背包)

将背包九讲往后看了看,学习了一下分组背包。来做几道入门题,试试手。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <cctype>
 7 #include <algorithm>
 8 #include <numeric>
 9 #include <limits.h>
10 #include <set>
11 using namespace std;
12
13 int dp[105], value[110][110];
14
15 int main () {
16     ios :: sync_with_stdio (false);
17     int m, n;
18     while (cin >> m >> n) {
19         if (m == 0 && n == 0) break;
20         memset (value, 0, sizeof(value));
21         memset (dp, 0, sizeof(dp));
22         for (int i = 1; i <= m; ++ i) {
23             for (int j = 1; j <= n; ++ j) {
24                 cin >> value[i][j];
25             }
26         }
27         for (int i = 1; i <= m; ++ i) {
28             for (int j = n; j >= 1; j --) {
29                 for (int k = 1; k <= j; ++ k) {
30                     dp[j] = max(dp[j], dp[j - k] + value[i][k]);
31                 }
32             }
33         }
34         cout << dp[n] << endl;
35     }
36     return 0;
37 }
时间: 2024-10-16 19:45:17

【HDU1712】ACboy needs your help(分组背包)的相关文章

HDU1712:ACboy needs your help(分组背包模板)

http://acm.hdu.edu.cn/showproblem.php?pid=1712 Problem Description 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 arrang

[hdu1712]ACboy needs your help分组背包

题意:一共$m$天,$n$门课程,每门课程花费$i$天得到$j$的价值,求最后获得的最大价值 解题关键:分组背包练习,注意循环的顺序不能颠倒 伪代码: $for$ 所有的组$k$   $for{\rm{ }}v = V..0$        $for$ 所有的$i$属于组$k$           $f[v] = \max (f[v],f[v] - c[i] + w[i])$ 背包问题本质上就是一种线性规划问题. 1 #include<bits/stdc++.h> 2 using namesp

hdu 1712 ACboy needs your help(分组背包入门)

1 /********************************************************** 2 题目: ACboy needs your help 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1712 4 题意: 一开始输入n和m,n代表有n门课,m代表你有m天,然 5 后给你一个数组,val[i][j],代表第i门课,在通过j 6 天去修,会得到的分数.求在m天能得到的最大分数. 7 算法: 分组背包 8 9

HDU 1712 ACboy needs your help-dp-(分组背包模型)

题意:n门课程用m天来学习,每门课用不同的天数来学习会有不同的学分,求能得到的最大的学分 分析:第一次接触分组背包.分组背包的模型就是不同的物品有不同的花费和价值,求在规定花费内能得到的最大的价值,这前面跟以前的背包最大的不同是物品分为几组,每组内的物品最多只能选一种:dp[i][j]表示前i组花费j能得到的最大的价值,不过实际在做的时候用一维数组就可以了 公式: for 组i for 花费j (从大到小) for 组内物品k if(j>=c[k]) dp[j]=max(dp[j],dp[j-c

HDU 1712 ACboy needs your help(分组背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1712 题意: 小杰有m天的时间去上n门不同的课. 对于第i门课来说, 如果小杰花j天的时间在该课上, 那么小杰可以获得val[i][j]的价值. 现在给出矩阵val[n][m], 要你求出小杰能获得的最大价值和? 分析: 咋一看, n门课, m天的时间, 要我们求最大价值. 那么明显是从n门课中选出合适的几门, 是的总花费的时间<=m的前提下, 价值最大化. 但是发现每门课有m种不同的价值获取方式. 所以我们

HDU1712 ACboy needs your help(分组背包)

题目大意: 一个人在M天中完成N门课程,每门课程的分数和所用的时间有关系,求解如何安排学习得分最高. 输入:两个整数N和M,接下来是使一个N*M的矩阵A.A[i][j]代表用j天学习第i门课程的分数. 输出:得到的最大分数. 解题思路: 每门作业i只能选择一个对应的天数来完成,也就是矩阵的每一行中至多之能选择一个数,典型的分组背包问题: 分组背包: 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].这些物品被划分为若干组,每组中的物品互相冲突,最多选一件.求解将哪些物品

HDU1712:ACboy needs your help(分组背包)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1712 解释看这里:http://www.cnblogs.com/zhangmingcheng/p/3940332.html 这题之前竟然做过,竟然不记得了,做了一个小时,竟然没A,(我连分组背包干什么的都忘了) 这题的博客以前也写过,我重新写这篇博客,就是提醒自己一下. 代码: #include <iostream> using namespace std; int a[101][101],f[101

【hdu1712】分组背包(每组最多选1个)

[分组背包] [题意]ACboy要开始选课了,上一门课能够获得的收益和他上这门课的时间是有关的,然后给你若干门课,让你帮他进行选课,每一门课自然是只能选择一个课程时长,问你如何选择,才能使ACboy获得的受益最大. for(k=1;k<=K;k++) for(int v=V;v>=0;v--) for(int i=item in group k) f[v]=max(f[v],f[v-c[i]+w[i]);保证用到的都是k-1所更新的而不是k所更新的. 1 #include<cstdio&

hdu1712 分组背包

ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5964    Accepted Submission(s): 3251 Problem Description ACboy has N courses this term, and he plans to spend at most M days