POJ之01背包系列
poj3624 Charm Bracelet
模板题
没有要求填满,所以初始化为0就行
#include<cstdio>
#include<iostream>
using namespace std;
#define N 15010
int n,m,v[N],c[N],f[N];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d%d",&v[i],&c[i]);
for(int i=;i<=n;i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+c[i]);
}
}
printf("%d\n",f[m]);
return ;
}
poj3628 Bookshelf 2
#include<cstdio>
#include<iostream>
using namespace std;
#define N 21000000
int n,m,sum,ans,c[],f[N];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&c[i]),sum+=c[i];
for(int i=;i<=n;i++){
for(int j=sum;j>=c[i];j--){
f[j]=max(f[j],f[j-c[i]]+c[i]);
}
}
for(int i=;i<=sum;i++){
if(f[i]>=m){
ans=f[i]-m;break;
}
}
printf("%d\n",ans);
return ;
}
poj1745 Divisibility
这道题如果取摸后范围比较小,第二维不大于100,然后记忆化背包(非递归搜索),根据能达到的值推能达到的值,衍生出前n个时的所有状态。
#include<cstdio>
#include<iostream>
using namespace std;
#define N 10005
int n,k,c[N];
bool f[N][];
int main(){
scanf("%d%d",&n,&k);
for(int i=,x;i<n;i++){
scanf("%d",&x);
if(x<) x=-x;
c[i]=x%k;
}
f[][c[]]=;
for(int i=;i<n;i++){
for(int j=;j<k;j++){
if(f[i-][j]){
f[i][(j+c[i])%k]=;
f[i][(j+k-c[i])%k]=;
}
}
}
puts(f[n-][]?"Divisible":"Not divisible");
return ;
}
poj1976 A Mini Locomotive
3辆车运货,共有n堆货,每辆可以运连续k堆,求最大运货量
保证k*3<=n;也就是说要运货量最大必须堆数为k。
f[i][j]为前j次前i堆最大运货量的最大运货量
如果i<j*k;那么只能全运
第i堆不运:f[i-1][j]
第i堆运:f[i-k][j-1]+sum;
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 50010
int n,k,T,s[N],f[N][];
int main(){
scanf("%d",&T);
while(T--){
memset(f,,sizeof f);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&s[i]),s[i]+=s[i-];
scanf("%d",&k);
for(int i=;i<=n;i++){
for(int j=;j<=;j++){
if(i<j*k)
f[i][j]=i;
else
f[i][j]=max(f[i-][j],f[i-k][j-]+s[i]-s[i-k]);
}
}
printf("%d\n",f[n][]);
}
return ;
}
poj1837 Balance
状态压缩求方案数
注意要平移数组
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define p 7500
#define N 21
int n,m,h[N],w[N],f[N][p*+];
int main(){
scanf("%d%d",&m,&n);
for(int i=;i<m;i++) scanf("%d",&h[i]);
for(int i=;i<=n;i++) scanf("%d",&w[i]);
f[][p]=;
for(int i=;i<=n;i++){
for(int k=;k<=p<<;k++){
if(f[i-][k]){
for(int j=;j<m;j++){
f[i][k+h[j]*w[i]]+=f[i-][k];
}
}
}
}
printf("%d\n",f[n][p]);
return ;
}
poj1948 Triangular Pastures
n个线,组一个三角形,求三角形的最大面积。
海伦公式
,p为半周长
因为周长已知,知道两条边就能确定面积。
设f[i][j](i>j),然后确定每一条边是否加入那个边,由已知状态推出未知状态,随之更新最大面积。
每条边不可能超过周长的一半。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
#define M 45
#define N 1605
int n,c,a[M];
bool f[N][N];
int ans=-0x7fffffff;
int check(int x,int y){
double t1=x;
double t2=y;
double t3=c-x-y;
if(t1+t2<t3||t1+t3<t2||t3+t2<t1) return -1.0;
double t=c*1.0/2.0;
double res=sqrt(t*(t-t1)*(t-t2)*(t-t3))*100.0;
return res;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",a+i),c+=a[i];
f[][]=;
for(int i=;i<=n;i++){
for(int j=c>>;j>=;j--){
for(int k=c>>;k>=j;k--){
if(j>=a[i]&&f[j-a[i]][k]) f[j][k]=;
if(k>=a[i]&&f[j][k-a[i]]) f[j][k]=;
if(f[j][k]) ans=max(ans,check(j,k));
}
}
}
printf("%d\n",ans);
return ;
}
POJ之01背包系列的更多相关文章
- poj 2184 01背包变形【背包dp】
POJ 2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14657 Accepte ...
- POJ 2184 01背包+负数处理
Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10200 Accepted: 3977 D ...
- poj 1837 01背包
Balance Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java clas ...
- POJ 3628 01背包 OR 状压
思路: 1.01背包 先找到所有奶牛身高和与B的差. 然后做一次01背包即可 01背包的容积和价格就是奶牛们身高. 最后差值一减输出结果就大功告成啦! 2. 搜索 这思路很明了吧... 搜索的确可以过 ...
- Proud Merchants(POJ 3466 01背包+排序)
Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ...
- POJ 3624 01背包
初学DP,用贪心的思想想解题,可是想了一个多小时还是想不出. //在max中的两个参数f[k], 和f[k-weight[i]]+value[i]都是表示在背包容量为k时的最大价值 //f[k]是这个 ...
- (01背包变形) Cow Exhibition (poj 2184)
http://poj.org/problem?id=2184 Description "Fat and docile, big and dumb, they look so stupid ...
- [POJ 2184]--Cow Exhibition(0-1背包变形)
题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total S ...
- POJ 3624 Charm Bracelet(01背包裸题)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38909 Accepted: 16862 ...
随机推荐
- java线程总结--synchronized关键字,原理以及相关的锁
在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问 ...
- 杭电 4907 Task schedule ·
Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之 ...
- 「BZOJ1537」Aut – The Bus(变形Dp+线段树/树状数组 最优值维护)
网格图给予我的第一反应就是一个状态 f[i][j] 表示走到第 (i,j) 这个位置的最大价值. 由于只能往下或往右走转移就变得显然了: f[i][j]=max{f[i-1][j], f[i][j-1 ...
- sqlserver复制表数据到另一个表
SQL Server中,如果目标表存在: insert into 目标表 select * from 原表; SQL Server中,,如果目标表不存在: select * into 目标表 from ...
- C++中的左移、右移运算
移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift). 逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充. 算术移位:移出去的位 ...
- Codeforces Round #296 (Div. 2) D. Clique Problem [ 贪心 ]
传送门 D. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- msp430入门编程12
msp430中C语言的模块化头文件及库文件12 msp430入门学习 msp430入门编程
- Reactor和Proactor模式的讲解(关于异步,同步,阻塞与非阻塞)
在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...
- poj2117求割点后最多的块。
tarjan算法,枚举割点(注意此题无向图可能不连通),每个割点分割后最大块数+连通分量-1即可.开始老是TLE,后来比较了他人代码,只在vector<vector<int.>.&g ...
- HDU 5700 区间交
枚举起点 二分终点 树状数组check #include<iostream> #include<cstring> #include<cmath> #include& ...