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 ...
随机推荐
- JS模块之AMD, CMD, CommonJS、UMD和ES6模块
CommonJS 传送门 同步加载,适合服务器开发,node实现了commonJS.module.exports和require 判断commonJS环境的方式是(参考jquery源码): if ( ...
- linux 配置文件要不要加上#! /bin/bash
现在一般的linux系统默认的shell都是bash.所以但很多unix系统可能会用bourne shell.csh或者ksh等来作为用户默认shell 如果你在写shell脚本的时候,用的语法只有b ...
- POJ 1006-Biorhythms,中国剩余定理,学信安的路过!
Biorhythms 我竟然1A了, 终于从一天的浑噩中找回点自信了.人生第一次做中国剩余定理的题 ...
- [POJ3041] Asteroids(最小点覆盖-匈牙利算法)
传送门 题意: 给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次. 解析: 把每一行与每一列当做二分图两边的点. 某格子有障碍,则对应行与列连边. ...
- Session保存用户名到Session域对象中
Session保存用户名 1.构造登录界面 用户名: 密 码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE html> < ...
- [NOIP2001] 提高组 洛谷P1027 Car的旅行路线
题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个 矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单 ...
- Separate code and data contexts: an architectural approach to virtual text sharing
The present invention provides a processor including a core unit for processing requests from at lea ...
- C. The Two Routes---cf602C(Dij)
http://codeforces.com/problemset/problem/602/C 题目大意: 有n个城市 有m条铁路 如果两个城市没有铁路 那么一定有公路 求从1 到 n 用铁路和公 ...
- codeforces 875F(基环外向树)
题意 有一个左边m个点,右边n个点的二分图(n,m<=1e5),左边每个点向右边恰好连两条权值相同的边. 求这个二分图的最优匹配 分析 对于这种二选一问题,即左边的a连向右边的b和c,权值为d, ...
- MySQL事务及Spring事务管理
事务,是在数据库中用于保证数据正确性的一种机制,涉及到很多概念以及不同的情况,这里做一个总结 相关概念 事务四特性(ACID) 原子性(Atomicity,或称不可分割性):要么全部完成或者全部不完成 ...