【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>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9
10 const int N=110;
11 int n,m,a[N][N],f[N];
12
13 int maxx(int x,int y){return x>y ? x:y;}
14
15 int main()
16 {
17     freopen("a.in","r",stdin);
18     while(1)
19     {
20         scanf("%d%d",&n,&m);
21         if(!n && !m) return 0;
22         for(int i=1;i<=n;i++)
23             for(int j=1;j<=m;j++)
24             {
25                 scanf("%d",&a[i][j]);
26             }
27         memset(f,0,sizeof(f));
28         for(int i=1;i<=n;i++)
29             for(int j=m;j>=1;j--)
30                 for(int k=1;k<=j;k++)
31                 {
32                     f[j]=maxx(f[j],f[j-k]+a[i][k]);
33                 }
34         printf("%d\n",f[m]);
35     }
36     return 0;
37 }
时间: 2024-10-13 00:29:22

【hdu1712】分组背包(每组最多选1个)的相关文章

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

hdu1712 分组背包 ACboy needs your help

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

hdu 3033(好题,分组背包)

I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4919    Accepted Submission(s): 2022 Problem Description After months of hard working, Iserlohn finally wins awesome amount of sc

hdu 1561 树形dp+分组背包

题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m)时选最多的宝物,而一个子节点中只可以选择一个状态进行转移,每个节点有若干个子节点,问题就转换为分组背包,几个子节点就是几个分组背包,体积是选几个地点,价值是宝物价值. 状态转移方程: dp[v][1] = Money[v]; (v为叶子节点)                    dp[v][j] = m

【hdu3033】分组背包(每组最少选一个)

[题意] 有S款运动鞋,一个n件,总钱数为m,求不超过总钱数且每款鞋子至少买一双的情况下,使价值最大.如果有一款买不到,就输出"Impossible". 1<=N<=100  1 <= M<= 10000 [题解] 首先明显这是一个分组背包. impossible 就直接看看每组最便宜的是否买得起. 因为每组最少选一个,所以我们可以这样dp: f[k][j]表示当前扫到第k组,容量为j. f[k][j]可由三个更新: f[k][j]=f[k][j] 不选当前物品

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

hdu 3033 I love sneakers!(分组背包,每组至少取一件)

http://acm.hdu.edu.cn/showproblem.php?pid=3033 大致题意:某人要买鞋子,有k种鞋,要求每种鞋至少买一双,给出每双鞋子的花费和价值,问m元钱可以买到的鞋子的最大价值是多少. 思路:分组背包问题.与传统的分组背包不同:每组物品至少取一件:且每组中物品任意取. 想一想传统的分组背包,每组至多选一件: for 所有的组k     for v=V..0         for 所有的i属于组k             f[v]=max{f[v],f[v-c[i

[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