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背包系列的更多相关文章

  1. poj 2184 01背包变形【背包dp】

    POJ 2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14657   Accepte ...

  2. POJ 2184 01背包+负数处理

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10200   Accepted: 3977 D ...

  3. poj 1837 01背包

    Balance Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java clas ...

  4. POJ 3628 01背包 OR 状压

    思路: 1.01背包 先找到所有奶牛身高和与B的差. 然后做一次01背包即可 01背包的容积和价格就是奶牛们身高. 最后差值一减输出结果就大功告成啦! 2. 搜索 这思路很明了吧... 搜索的确可以过 ...

  5. Proud Merchants(POJ 3466 01背包+排序)

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  6. POJ 3624 01背包

    初学DP,用贪心的思想想解题,可是想了一个多小时还是想不出. //在max中的两个参数f[k], 和f[k-weight[i]]+value[i]都是表示在背包容量为k时的最大价值 //f[k]是这个 ...

  7. (01背包变形) Cow Exhibition (poj 2184)

    http://poj.org/problem?id=2184   Description "Fat and docile, big and dumb, they look so stupid ...

  8. [POJ 2184]--Cow Exhibition(0-1背包变形)

    题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  9. POJ 3624 Charm Bracelet(01背包裸题)

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38909   Accepted: 16862 ...

随机推荐

  1. 条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)

    NOTE: 1.以独立语句将newed对象存储于智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏.

  2. vs2017编译boost 1.70.0

    目前最新版本的boost库是1.70.0.现在在学习使用cinatra搭建c++的http服务器,需要用到boost库中的asio,下载了一下最新版本的boost库,捣鼓了半天. 1.下载 boost ...

  3. 国内UED收录

    腾讯 腾讯CDC http://cdc.tencent.com/ CDC(Customer Research & User Experience Design Center)腾讯用户研究与体验 ...

  4. Java基础学习总结(92)——Java编码规范之排版、注释及命名

    为使开发人员养成良好的开发习惯,编写可读性强.易维护的程序,结合以往资料,现整理Java编码规范,将之作为开发人员的参照依据. 一.排版 1.相对独立的程序块之间必须加空行 下列情况应该使用一个空行: ...

  5. 三、Oracle常用内置函数

    1. ASCII  返回与指定的字符对应的十进制数;  SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from d ...

  6. POJ-3100-Root of the Problem,原来是水题,暴力求解~~~

    Root of the Problem Time Limit: 1000MS   Memory Limit: 65536K               http://poj.org/problem?i ...

  7. BZOJ4580: [Usaco2016 Open]248

    n<=248个数字,可以进行这样的操作:将相邻两个相同的数字合并成这个数字+1,求最大能合成多少. f(i,j)--区间i到j能合成的最大值,f(i,j)=max(f(i,k)+1),f(i,k ...

  8. C++,C程序设计入门——《高质量程序设计第4章》

    1. 连接规范 1. extern “C” 2. 一部分采用C的连接规范 #ifdef __cplusplus extern "C" { #endif #ifdef __cplus ...

  9. 并发编程——IO模型

    前言 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, ...

  10. iOS - 系统方法中弃用的关键字的了解 NS_AVAILABLE和NS_DEPRECATED

    NS_AVAILABLE_IOS(5_0)  这个方法可以在iOS5.0及以后的版本中使用,如果在比5.0更老的版本中调用这个方法,就会引起崩溃.  NS_AVAILABLE(_mac, _ios) ...