题目链接:https://www.rqnoj.cn/problem/624

题意:

  小明有奖学金啦!所以他要去买运动鞋。

  总共有n款鞋,分别属于t个品牌。

  每款鞋的价格为c[i],在小明心目中的价值为w[i]。

  小明只有m元的奖学金。

  小明同学有强迫症,每个品牌都要至少买一双,并且同一款不会买两双。

  问你所买的鞋在小明心目中的价值之和最大为多少。

题解:

  表示状态:

    dp[i][j][k][p] = max value

    i:考虑到第i个品牌

    j:考虑到第i个品牌中的第j款鞋

    k:当前花费

    p:第i个品牌是否至少买了一双 (p == 0 / 1)

  找出答案:

    max dp[t][0][k][0] (0<=k<=m)

    考虑到第t个品牌(不存在)的第一双鞋。

  如何转移:

    now: dp[i][j][k][p]

    三种决策:

      (1)买当前的鞋,接下来考虑当前品牌的下一款鞋  (买)

      (2)不买当前的鞋,接下来考虑当前品牌的下一款鞋 (不买)

      (3)买当前的鞋,接下来考虑下一个品牌的第一款鞋 (下个品牌)

    对应方程:

      dp[i][j+1][k+c[i][j]][1] = dp[i][j][k][p] + w[i][j]

      dp[i][j+1][k][p] = dp[i][j][k][p]

      dp[i+1][0][k][0] = dp[i][j][k][1]

  边界条件:

    dp[0][0][0][0] = 0

    others = -1

AC Code:

 // state expression:
// dp[i][j][k][p] = max value
// i: considering ith brand
// j: considering jth shoes
// k: present cost
// p: whether ith brand has been boungth (p == 0/1)
//
// find the answer:
// max dp[t][0][k][0]
//
// transferring:
// now: dp[i][j][k][p]
// dp[i][j+1][k+c[i][j]][1] = dp[i][j][k][p] + w[i][j]
// dp[i][j+1][k][p] = dp[i][j][k][p]
// dp[i+1][0][k][0] = dp[i][j][k][1]
//
// boundary:
// dp[0][0][0][0] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 105
#define MAX_T 15
#define MAX_C 10005 using namespace std; int n,m,t;
int x,y,z;
int ans;
int dp[MAX_T][MAX_N][MAX_C][];
int cnt[MAX_T];
int c[MAX_T][MAX_N];
int w[MAX_T][MAX_N]; void read()
{
memset(cnt,,sizeof(cnt));
cin>>n>>m>>t;
for(int i=;i<n;i++)
{
cin>>x>>y>>z;
c[x][cnt[x]]=y;
w[x][cnt[x]]=z;
cnt[x]++;
}
} void solve()
{
ans=-;
memset(dp,-,sizeof(dp));
dp[][][][]=;
for(int i=;i<=t;i++)
{
for(int j=;j<=cnt[i];j++)
{
for(int k=;k<=m;k++)
{
for(int p=;p<;p++)
{
if(dp[i][j][k][p]!=-)
{
if(k+c[i][j]<=m && j+<=cnt[i])
{
dp[i][j+][k+c[i][j]][]=max(dp[i][j+][k+c[i][j]][],dp[i][j][k][p]+w[i][j]);
}
if(j+<=cnt[i])
{
dp[i][j+][k][p]=max(dp[i][j+][k][p],dp[i][j][k][p]);
}
dp[i+][][k][]=max(dp[i+][][k][],dp[i][j][k][]);
}
}
}
}
}
for(int j=;j<=m;j++)
{
ans=max(ans,dp[t+][][j][]);
}
} void print()
{
if(ans==-) cout<<"Impossible"<<endl;
else cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}

RQNOJ 624 运动鞋:dp的更多相关文章

  1. UVA 624 CD(DP + 01背包)

    CD You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music i ...

  2. RQNOJ 188 购物问题:树形dp

    题目链接:https://www.rqnoj.cn/problem/188 题意: 商场以超低价格出售n个商品,购买第i个商品所节省的金额为w[i]. 为了防止亏本,有m对商品是不能同时买的.但保证商 ...

  3. RQNOJ 569 Milking Time:dp & 线段问题

    题目链接:https://www.rqnoj.cn/problem/569 题意: 在一个数轴上可以摆M个线段,每个线段的起始终止端点给定(为整数),且每个线段有一个分值,问如何从中选取一些线段使得任 ...

  4. RQNOJ 514 字串距离:dp & 字符串

    题目链接:https://www.rqnoj.cn/problem/514 题意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字 ...

  5. RQNOJ 328 炮兵阵地:状压dp

    题目链接:https://www.rqnoj.cn/problem/328 题意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队. 一个N*M的地图由N行M列组成(N≤100,M≤10), ...

  6. RQNOJ 311 [NOIP2000]乘积最大:划分型dp

    题目链接:https://www.rqnoj.cn/problem/311 题意: 给你一个长度为n的数字,用t个乘号分开,问你分开后乘积最大为多少.(6<=n<=40,1<=k&l ...

  7. RQNOJ 169 最小乘车费用:水dp

    题目链接:https://www.rqnoj.cn/problem/169 题意: 给出行驶1-10公里的费用(所有车一样),可以倒车,问行驶n公里的最小费用. 题解: 大水题... (=´ω`=) ...

  8. RQNOJ 140 分配时间:dp

    题目链接:https://www.rqnoj.cn/problem/140 题意: 小王参加的考试是几门科目的试卷放在一起考,一共给t分钟来做. 他现在已经知道第i门科目花k分钟可以拿到w[i][k] ...

  9. RQNOJ 622 最小重量机器设计问题:dp

    题目链接:https://www.rqnoj.cn/problem/622 题意: 一个机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得. w[i][j]是从供应商j处购得的部件i的重量, ...

随机推荐

  1. C/C++内存管理详解(转)

    内存分配方式 简介 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动 ...

  2. canvas图片压缩,局部放大,像素处理

    直接上代码:(具体看注释) 需要引用jquery.min.js <!DOCTYPE html> <html lang="en"> <head> ...

  3. hdu2141Can you find it?

     给你四个集合.要你从这四个集合中 各取出一个数出来,推断,取出的前三个数的和 是否等于第四个数. 数据比較大.我的做法是将 前两个集合全部数全部和的情况取出来, 然后二分查找第四个集合和第三集合 ...

  4. C#获取webbrowser完整cookie

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] //API设定Cookie stat ...

  5. [ 转]C++ 虚函数表解析

    http://blog.csdn.net/haoel/article/details/1948051 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子 ...

  6. solr入门之pinyin4j源代码改写动态加入扩展词及整合进war项目中

    1.初始化时载入用户定义的字典 package net.sourceforge.pinyin4j; import net.sourceforge.pinyin4j.multipinyin.Trie; ...

  7. Hibernate “N+1”查询问题

    Hibernate 默认情况下使用立即检索策略,即从数据库加载A对象时  会同时加载跟它关联的B,这样产生了不必要的对象集合查询,而且本来可以合并的sql要执行1+N次,因为一条select出所有的A ...

  8. servletResponse 实用的页面跳转技术和定时刷新技术

    package response; import java.io.IOException;import java.util.Random; import javax.servlet.ServletEx ...

  9. 向oracle中插入date时,持久层sql怎么写???

    public class EmpDao { public void addEmp(Emp emp) throws SQLException { QueryRunner runner = new Que ...

  10. 安卓ADT离线安装

    http://jingyan.baidu.com/article/3aed632e66858770108091bf.html