hdu 3535 (最少1,最多1,任意)(背包混合)(好题)
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,任意)(背包混合)(好题)的更多相关文章
- HDU 2159 FATE(二维费用背包)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 1712 ACboy needs your help(包背包)
HDU 1712 ACboy needs your help(包背包) pid=1712">http://acm.hdu.edu.cn/showproblem.php? pid=171 ...
- HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...
- HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)
HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包) 题意分析 裸的完全背包问题 代码总览 #include <iostream> #include <cstdio> ...
- HDU 1257 最少拦截系统 最长递增子序列
HDU 1257 最少拦截系统 最长递增子序列 题意 这个题的意思是说给你\(n\)个数,让你找到他最长的并且递增的子序列\((LIS)\).这里和最长公共子序列一样\((LCS)\)一样,子序列只要 ...
- 【python实例】要求输出字符串中最少一个最多八个的所有字符串组合(连续)
""" 题目:字符串str="ABCDEFGHIJK",要求输出最少一个最多八个的所有组合(向后连续字母) 输出如下: A [0::] AB ABC ...
- HDU 3535 分组混合背包
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...
- hdu 3535 AreYouBusy 分组背包
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...
随机推荐
- 1,Thread 概念以及Thread 的6个状态
Thread 有6个状态 , NEW, RUNNABLE , BLOCKED, WATTING, TIMED WAITING, TERMINATED 1.NEW至今尚未启动的线程的状态.2.RUNNA ...
- 如何高度自定义CollectionView的header和foot
最近在研究CollectionView,突然发现觉得他的HeaderSection和FootSection也可以高度自定义. 国外有详细的教程:http://www.appcoda.com/ios-c ...
- 51 Nod 1024 Set
1024 矩阵中不重复的元素 1 秒 131,072 KB 10 分 2 级题 一个m*n的矩阵. 该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b 第二列是a^( ...
- Windows下Anaconda安装 python + tensorflow GPU版
这里首先确认没有安装CPU版本,并默认已经安装了CUDA和Cudnn以及anaconda. 安装gpu版本的tensorflow 接下来需要安装GPU版本的tensorflow: 打开cmd并输入: ...
- Saiku2.6 配置数据源
把连接字符串和Schema文件放这里.
- python高级(三)—— 字典和集合(泛映射类型)
本文主要内容 可散列类型 泛映射类型 字典 (1)字典推导式 (2)处理不存在的键 (3)字典的变种 集合 映射的再讨论 python高级——目录 文中代码均放在github上:https://git ...
- Java操作系统剪贴板(Clipboard)复制粘贴
Java操作系统剪贴板(Clipboard)复制粘贴
- Python3 scrapy 新手命令
基本命令 建立项目 scrapy startproject projectname #在CMD命令框内执行,路径是你需要保存的位置 建立爬虫 cd projectname #在CMD命令框内执行,目的 ...
- Ntp客户端
function parseMsg (buffer) { if (buffer.length !== 48) return; const pkt = {}, now = new Date().getT ...
- 服务端模拟http服务请求客户端
try { InputStream in = req.getInputStream(); int i = -1; ByteArrayOutputStream out = new ByteArrayOu ...