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

题意

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 组物品花费费用v所能取得的最大价值

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值