http://blog.csdn.net/yan_____/article/details/8530833

这个问题一开始我用滚动,没有做出来,可能要需要先预处理排序才行,后来看了别人的方法,开始用二维

首先是初始化:

mem(dp,-1);
mem(dp[0],0);

0的时候,最少一次:

除0外其他都为-1

因为没有继承上一层的状态,所以这一层滚动时,所以这一层不能达到的状态还是-1,

后面的层数都会继承这一层的状态,一定会选上一个,>=1

对于已存在的状态,dp[i][j] = max(dp[i][j],dp[i-1][j - c[i] ] + w[i]) 上一层+这一层

对于当前滚动状态,dp[i][j] = max(dp[i][j],dp[i][j - c[i] ] + w[i] ) 这一层之间的累加

1的时候,最多一次:

继承上一层状态,只有当上个值存在时才更新

dp[i][j] = max(dp[i][j],dp[i-1][j - c[i] ] + w[i] )

因为判断的是上一层的状态,所以这一层的之间不会叠加,<=1

2的时候:

继承上一层状态,只有当上个值存在时才更新

dp[i][j] = max(dp[i][j],dp[i][j - c[i] ] + w[i] )

判断的是这一层的状态,可以任意叠加

#include<stdio.h>
#include<string.h>
#define size 110
int dp[size][size];
int c[size];
int w[size];
int n,t,m,s;
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,k;
while(scanf("%d %d",&n,&t)!=EOF)
{
memset(dp,-,sizeof(dp));
memset(dp[],,sizeof(dp[]));
for(i=;i<=n;i++)
{
scanf("%d %d",&m,&s);
for(j=;j<m;j++)
{
scanf("%d %d",&c[j],&w[j]);
}
if(s==)
{
for(k=;k<m;k++)
{
for(j=t;j>=c[k];j--)
{
if(dp[i][j-c[k]]!=-)
{
dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+w[k]);
printf("i%d j%d k%d dp%d\n",i,j,k,dp[i][j]);
}
if(dp[i-][j-c[k]]!=-)
{
dp[i][j]=max(dp[i][j],dp[i-][j-c[k]]+w[k]);
printf("i%d j%d k%d dp%d\n",i,j,k,dp[i][j]);
}
}
}
}
else if(s==)
{
for(j=;j<=t;j++)
dp[i][j]=dp[i-][j];
for(k=;k<m;k++)
{
for(j=t;j>=c[k];j--)
{
if(dp[i-][j-c[k]]!=-)
{
dp[i][j]=max(dp[i][j],dp[i-][j-c[k]]+w[k]);
printf("i%d j%d k%d dp%d\n",i,j,k,dp[i][j]);
}
}
}
}
else
{
for(j=;j<=t;j++)
dp[i][j]=dp[i-][j];
for(k=;k<m;k++)
{
for(j=t;j>=c[k];j--)
{
if(dp[i][j-c[k]]!=-)
{
dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+w[k]);
printf("i%d j%d k%d dp%d\n",i,j,k,dp[i][j]);
}
}
}
}
}
printf("%d\n",dp[n][t]);
}
return ;
}

hdu 3535 (最少1,最多1,任意)(背包混合)(好题)的更多相关文章

  1. HDU 2159 FATE(二维费用背包)

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. HDU 1712 ACboy needs your help(包背包)

    HDU 1712 ACboy needs your help(包背包) pid=1712">http://acm.hdu.edu.cn/showproblem.php? pid=171 ...

  3. HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)

    HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...

  4. HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)

    HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包) 题意分析 裸的完全背包问题 代码总览 #include <iostream> #include <cstdio> ...

  5. HDU 1257 最少拦截系统 最长递增子序列

    HDU 1257 最少拦截系统 最长递增子序列 题意 这个题的意思是说给你\(n\)个数,让你找到他最长的并且递增的子序列\((LIS)\).这里和最长公共子序列一样\((LCS)\)一样,子序列只要 ...

  6. 【python实例】要求输出字符串中最少一个最多八个的所有字符串组合(连续)

    """ 题目:字符串str="ABCDEFGHIJK",要求输出最少一个最多八个的所有组合(向后连续字母) 输出如下: A [0::] AB ABC ...

  7. HDU 3535 分组混合背包

    http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...

  8. hdu 3535 AreYouBusy 分组背包

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  9. [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...

随机推荐

  1. Levenshtein字符串距离算法介绍

    Levenshtein字符串距离算法介绍 文/开发部 Dimmacro KMP完全匹配算法和 Levenshtein相似度匹配算法是模糊查找匹配字符串中最经典的算法,配合近期技术栏目关于算法的探讨,上 ...

  2. Java实现文件重命名

    最近在做一个Android上面的一个文件管理器的apk,有文件名重命名和剪切的功能. 一般的思路如下: 重命名:先新建一个文件,复制原先的文件,读写文件,最后删除原先文件 剪切:先复制原先的文件,删除 ...

  3. 如何调用另一个包中的Application

    在项目中要集成Xabber,将它作为一个Lib, ..... Xabber 原有代码 /** * Base entry point. * * @author alexander.ivanov */ p ...

  4. 移动端尺寸新写法-rem

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...

  5. 解析XMl文档和字符串

    //解析xml字符串 txt="<bookstore><book>"; txt=txt+"<title>Everyday Italia ...

  6. SQL多字段排序

    emm 其实也没什么 就是写sql查询的时候 要对多个字段排序比如  查询原本的数据是 年份 科目 批次 2014 理科 本二2015 理科 本二 2015 理科 本一2016 理科 本二 2016 ...

  7. [转] kerberos介绍

    [From] https://www.cnblogs.com/ulysses-you/p/8107862.html 重要术语 1. KDC 全称:key distributed center 作用:整 ...

  8. element-ui tree树形组件自定义实现可展开选择表格

    最近做项目遇到一个需求,表格里可以展开,可以选择,大概效果如下图: 一开始是在table组件里找方法,使用了表格的合并方法,效果是实现了,但是表格的多选每次触发时,都会执行好几次,而且没法实现一部分的 ...

  9. C#编写运行在Linux环境下的采用Mediainfo来获取多媒体文件信息的代码

    项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求调整为可以在Linux下运行,经过这两天的资料查找,实现了Linux下通过.NET来获取多 ...

  10. SQLite3开发接口函数详解

    SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的: ...