hdu 1712 分组背包

背景:1Y,01背包多加了一个挑选循环而已。

分组背包的典型描述:对于很多背包,把它分为k个组,每个组内的组员是相互冲突的,所以只能选择一个。

我的代码:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

int main(void){
    int n,m;
    while(scanf("%d%d",&n,&m),n*n+m*m){
        int c[n][m],F[101];
        memset(F,0,sizeof(F));
        for(int i=0;i < n;i++)
            for(int j=0;j < m;j++)
                scanf("%d",&c[i][j]);
        for(int i=0;i < n;i++){
            for(int j=m;j >= 1;j--){
                for(int k=0;k < m;k++){
                    if(k+1 <= j) F[j]=max(F[j],F[j-k-1]+c[i][k]);
                }
            }
        }
        printf("%d\n",F[m]);
    }
    return 0;
}
时间: 2024-10-09 17:02:10

hdu 1712 分组背包的相关文章

hdu 1712 分组背包入门

对于每门课程,学习的时间不同,收获也不同,在一门课程上花费了两个不同的时间去学习是互斥的,即它们是属于同一个组内的物品,直接做分组背包即可. 需要注意三重循环的顺序不可变! 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int INF = -99999999; 7 const int N = 101; 8 int a[N][N

HDU 3033 分组背包

http://www.hgy413.com/1319.html 简介DeviceIoControl的三种通信方式 HDU 3033 分组背包,布布扣,bubuko.com

HDU 4341 分组背包

B - Gold miner Time Limit:2000MS Memory Limit:32768KB     Description Homelesser likes playing Gold miners in class. He has to pay much attention to the teacher to avoid being noticed. So he always lose the game. After losing many times, he wants you

HDU 3033 分组背包变形(每种至少一个)

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

hdu 3033 分组背包(每组至少选一个)

题意:有个小娃娃得了奖学金要去买东西,一共有n个东西分为k组,每个东西有一个花费和价值,问在每组东西至少买一个的条件下,小娃娃用他的奖学金买东西可以获得的最大价值. 思路:定义状态dp[i][v]表示在[1, i]组物品都至少有一个被购买时用v(背包容量)这么多钱能得到多少价值. 状态转移方程: if ( dp[i][v - cost[i][j]] != -1 ) dp[i][v] = max( dp[i][v], dp[i][v - cost[i][j]] + val[i][j] ); if

hdu 3535 分组背包

题意: 有n组工作,现在有T分钟时间去做一些工作.每组工作里有m个工作,并且类型为s,s类型可以为0,1,2,分别表示至少选择该组工作的一项,至多选择该工作的一项,不限制选择.每个工作有ci,gi两个属性,表示需要花费ci时间去完成该项工作,完成后将会获得gi的快乐值,现在求快乐值最大多少,如果不能完成工作,输出-1: 原题如下: AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java

二维费用,依赖,分组背包

二维费用背包 01背包进阶版 有N件物品和一个空间容量为C,重量容量为W的背包,第 i 件物品的空间费用为c[i] ,重量费用为 wi,价值是 vi,每种物品仅有一件,可以选择放或不放,求将哪些物品装入背包可使价值总和最大 01背包: f[i][j]=max(f[i?1][j],f[i?1][j?w[i]]+v[i]) 空间降维写法 for (int i = 1; i <= n; i++) for (int j = V; j >= w[i]; j--) f[j] = max(f[j], f[j

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