HDOJ1059(多重背包)
1.解法一:多重背包
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX(a,b) (a>b)?a:b
const int SIZE=+;
int dp[SIZE];
int bag[];
int nLimit; void ZeroOnePack(int cost, int value)
{
for(int i=nLimit; i>=cost; i--)
dp[i]=MAX(dp[i],dp[i-cost]+value);
} void CompletePack(int cost, int value)
{
for(int i=cost; i<=nLimit; i++)
dp[i]=MAX(dp[i],dp[i-cost]+value);
} void MultiplyPack(int cost, int value, int amount)
{
if(amount*cost>=nLimit) CompletePack(cost,value);
else
{
int k=;
while(k<amount)
{
ZeroOnePack(k*cost, k*value);
amount-=k;
k<<=;
} ZeroOnePack(amount*cost,amount*value);
}
} bool CheckFinish()
{
for(int i=;i<=;i++)
if(bag[i]!=)
return false;
return true;
} int main()
{
int T=;
while(true)
{
int sum=;
for(int i=; i<=; i++)
{
scanf("%d",&bag[i]);
sum+=bag[i]*i;
}
if(CheckFinish())
break; printf("Collection #%d:\n",++T);
if(sum%==)
{
printf("Can't be divided.\n");
}
else
{
memset(dp,,sizeof(dp));
nLimit=sum/;
for(int i=;i<=;i++)
{
MultiplyPack(i,i,bag[i]);
}
if(dp[nLimit]==nLimit)
printf("Can be divided.\n");
else
printf("Can't be divided.\n");
}
printf("\n"); } return ;
}
2.解法二:多重部分和
#include<cstdio>
#include<cstring>
using namespace std;
const int SIZE=+;
int a[];
int dp[SIZE];
bool check()
{
for(int i=;i<;i++)
if(a[i]!=)
return true;
return false;
}
int sum; int main()
{
int t=;
while(true)
{
sum=;
for(int i=;i<;i++)
{
scanf("%d",&a[i]);
sum+=(i+)*a[i];
}
if(!check())
break; printf("Collection #%d:\n",++t);
if(sum%==)
{
printf("Can't be divided.\n");
}
else
{
memset(dp,-,sizeof(dp));
int k=sum/;
dp[]=;
for(int i=;i<;i++)
{
for(int j=;j<=k;j++)
{
if(dp[j]>=)
{
dp[j]=a[i];
}
else if(j<(i+)||dp[j-(i+)]<=)
{
dp[j]=-;
}
else
{
dp[j]=dp[j-(i+)]-;
}
}
}
if(dp[k]>=)
{
printf("Can be divided.\n");
}
else
{
printf("Can't be divided.\n");
}
}
printf("\n");
}
return ;
}
3.解法三:判断多重背包可否装满
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX(a,b) (a>b)?a:b
const int SIZE=+;
const int INF=;
int dp[SIZE];
int bag[];
int nLimit;
bool CheckFinish()
{
for(int i=;i<=;i++)
if(bag[i]!=)
return false;
return true;
} int main()
{
int T=;
while(true)
{
int sum=;
for(int i=; i<=; i++)
{
scanf("%d",&bag[i]);
sum+=bag[i]*i;
}
if(CheckFinish())
break; printf("Collection #%d:\n",++T);
if(sum%==)
{
printf("Can't be divided.\n");
}
else
{
nLimit=sum/;
memset(dp,,sizeof(dp));
dp[]=;
int dpt[];
for(int i=;i<=;i++)
{
memset(dpt,,sizeof(dpt));
for(int j=i;j<=nLimit;j++)
if(!dp[j]&&dp[j-i]&&dpt[j-i]<bag[i])
{
dpt[j]=dpt[j-i]+;
dp[j]=;
}
} if(dp[nLimit])
{
printf("Can be divided.\n");
}
else
{
printf("Can't be divided.\n");
}
} printf("\n");
} return ;
}
判断模板:
memset(dp,,sizeof(dp));
dp[]=;
int used[];
for(int i=;i<=nKind;i++)
{
memset(used,,sizeof(used));
for(int j=weight[i];j<=nLimit;j++)
if(!dp[j]&&dp[j-weight[i]]&&used[j-weight[i]]<bag[i])
{
used[j]=used[j-weight[i]]+;
dp[j]=;
}
}
HDOJ1059(多重背包)的更多相关文章
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- HDU 2082 找单词 (多重背包)
题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...
- Poj 1276 Cash Machine 多重背包
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26172 Accepted: 9238 Des ...
- poj 1276 Cash Machine(多重背包)
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33444 Accepted: 12106 De ...
- (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)
http://poj.org/problem?id=3260 Description Farmer John has gone to town to buy some farm supplies. ...
- (多重背包+记录路径)Charlie's Change (poj 1787)
http://poj.org/problem?id=1787 描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- POJ1742 Coins[多重背包可行性]
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 34814 Accepted: 11828 Descripti ...
- POJ1276Cash Machine[多重背包可行性]
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32971 Accepted: 11950 De ...
随机推荐
- UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-3: ordinal not in range(256)
今天使用MySQLdb往MySQL插入中文数据遇到一个异常: UnicodeEncodeError: 'latin-1' codec can't encode characters in positi ...
- python 数据结构中被忽视的小技巧
一.一个包含N个元素的字符串.元组.序列.以及任何可迭代对象均可以拆分成N个单独的“变量” 1.字符串的拆分 #字符串 In [10]: s="abdefg" In [11]: o ...
- 提供的STC89C52RC单片机GPS在LCD1602液晶只显示welcome to use问题?
1.使用USB-TTL接GPS单独测试GPS定位在所处环境看是否能定位到. 2.检查自己使用的单片机是不是STC89C52RC型号,提供例程使用的这个型号单片机.如果使用其他51单片机,请先使用STC ...
- NSAttributedStringKey
NSFontAttributeName; //字体,value是UIFont对象 NSParagraphStyleAttributeName;//绘图的风格(居中,换行模式,间距等诸多风格),valu ...
- Windows命令行(DOS命令)教程
一.命令行简介 命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序. 在这里,先解释什么是DOS? DOS——Disk Operation System 磁盘 ...
- c的详细学习(5)数组
到目前为止,前面介绍的都是属于基本类型的数据.除此之外,C语言还提供了一些更为复杂的数据类型,称为构造类型.数组就是最基本的构造类型.若要针对一批数据进行某种操作,采用数组是一种方便可行的方法 ...
- [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Spark Structured Streaming框架(3)之数据输出源详解
Spark Structured streaming API支持的输出源有:Console.Memory.File和Foreach.其中Console在前两篇博文中已有详述,而Memory使用非常简单 ...
- (转)Windows下面安装和配置MySQL(5.6.20)
原文地址:http://www.cnblogs.com/qiyebao/p/3887055.html 1.首先到http://dev.mysql.com/ 上下载windows版mysql5.6免安装 ...
- Logstash的插件
Logstash的插件: input插件: File:从指定的文件中读取事件流: 使用FileWatch(Ruby Gem库)监听文件的变化. .sincedb:记录了每个被监听的文件的inode, ...