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 ...
随机推荐
- root连接ubuntu18.04“拒绝访问”的解决方法
1.设置root账户 sudo passwd root 2.ssh远程登陆拒绝访问:修改SSH配置文件 sudo vim /etc/ssh/sshd_config 找到并用#注释掉这行:PermitR ...
- 使用scrapy爬取suning
# -*- coding: utf-8 -*- import scrapy from copy import deepcopy class SuSpider(scrapy.Spider): name ...
- ES6(Iterator 和 for...of 循环)
Iterator 和 for...of 循环 1.什么是 Iterator 接口 Iterator 接口功能:用一种相同办法的接口让不同的数据结构得到统一的读取命令的方式 2.Iterator的基本用 ...
- Linux使用Mutt发送邮件/附件
使用Mutt发邮件极其方便,只需要一条命令即可发送或者批量发送邮件 功能说明:E-mail管理程序. 语 法:mutt [-hnpRvxz][-a<文件>][-b<地址>][- ...
- [USACO10FEB]慢下来Slowing down
线段树 树的dfs序 来自 洛谷 P1982 的翻译 by GeneralLiu 来自 jzyz 的翻译 %mzx 线段树 dfs序 数据结构的应用 “数据结构 是先有需求 再有应用” ...
- hdu 2669 扩展欧几里得(裸)
#include<stdio.h> #include<iostream> #define ll __int64 ll gcd(ll a,ll b,ll &x,ll &a ...
- @JoinColumn 匹配关联多个字段
两张表结构如下 TABLE_A: ID, COLA1, COLA2 TABLE_B: ID, A_ID, COLB1, COLB2 A和B是一对多的关系. 我在B的BEAN上面,通过Anotation ...
- Codeforces Round #292 (Div. 2) D. Drazil and Tiles [拓扑排序 dfs]
传送门 D. Drazil and Tiles time limit per test 2 seconds memory limit per test 256 megabytes Drazil cre ...
- ACM-ICPC 2018 焦作赛区网络预赛 H、L
https://nanti.jisuanke.com/t/31721 题意 n个位置 有几个限制相邻的三个怎么怎么样,直接从3开始 矩阵快速幂进行递推就可以了 #include <bits/st ...
- [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)
4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 374 Solved: 130[Submit][Status][Disc ...