poj 01背包
首先我是按这篇文章来确定题目的。
poj3624 Charm Bracelet
模板题
没有要求填满,所以初始化为0就行
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int w[3403];
int h[3403];
int n,m;
int dp[12880+9];
int main()
{
// freopen("input.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d%d",&w[i],&h[i]);
for(int i=0;i<n;i++)
for(int j=m;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+h[i]);
printf("%d\n",dp[m]);
}
poj3628 Bookshelf 2
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int h[25];
int dp[21000000];
int n,s;
int sum;
int main()
{
// freopen("input.txt","r",stdin);
scanf("%d%d",&n,&s);
for(int i=0;i<n;i++){
scanf("%d",&h[i]);
sum+=h[i];
}
int ans=0;
for(int i=0;i<n;i++)
for(int j=sum;j>=h[i];j--)
dp[j]=max(dp[j],dp[j-h[i]]+h[i]);
for(int i=0;i<=sum;i++)
if(dp[i]>=s){
ans=dp[i]-s;
break;
}
printf("%d\n",ans);
}
poj3211 Washing Clothes
这道题就是两个人同时在一个盆子里洗衣服,算的时候每件衣服独立算,然后相同衣服之间可以连续,我们需要求得是在一半体积下那个花的时间大的值。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<iostream>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
int n,m;
map<string,int> q;
int w[105];
vector<int> g[11];
int dp[50000];
int main()
{
// freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m)==2&&n&&m)
{
string str;
memset(w,0,sizeof(w));
q.clear();
for(int i=0;i<=10;i++)
g[i].clear();
for(int i=0;i<n;i++)
{
cin>>str;
q[str]=i;
}
for(int i=0;i<m;i++)
{
int t,v;
cin>>v>>str;
t=q[str];
g[t].push_back(v);
w[t]+=v;
}
int ans=0;
for(int i=0;i<n;i++)
{
int v=w[i]/2;
memset(dp,0,sizeof(dp));
for(int j=0;j<g[i].size();j++)
for(int k=v;k>=g[i][j];k--)
{
dp[k]=max(dp[k],dp[k-g[i][j]]+g[i][j]);
}
ans+=(w[i]-dp[v]);
}
printf("%d\n",ans);
}
}
poj1745 Divisibility
这道题如果取摸后范围比较小,第二维不大于100,然后记忆化背包(非递归搜索),根据能达到的值推能达到的值,衍生出前n个时的所有状态。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<iostream>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
int n,k;
int c[10005];
int dp[10005][105];
int main()
{
//freopen("input.txt","r",stdin);
int t;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&t);
if(t<0) t=-t;
t%=k;
c[i]=t;
}
dp[0][c[0]]=1;
for(int i=1;i<n;i++)
{
for(int j=0;j<k;j++)
{
if(dp[i-1][j])
{
dp[i][(j+c[i])%k]=1;
dp[i][(j+k-c[i])%k]=1;
}
}
}
if(dp[n-1][0])
printf("Divisible\n");
else
printf("Not divisible\n");
}
poj1976 A Mini Locomotive
3辆车运货,共有n堆货,每辆可以运连续k堆,求最大运货量
保证k*3<=n;也就是说要运货量最大必须堆数为k。
dp[i][j]为前j次前i堆最大运货量的最大运货量
如果i<j*k;那么只能全运
第i堆不运:dp[i-1][j]
第i堆运:dp[i-k][j-1]+sum;
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int a[50005];
int n,k;
int dp[50005][4];
int main()
{
//freopen("input.txt","r",stdin);
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
a[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
scanf("%d",&k);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=3;j++)
{
if(i<j*k)
dp[i][j]=i;
else
dp[i][j]=max(dp[i-1][j],dp[i-k][j-1]+a[i]-a[i-k]);
}
}
printf("%d\n",dp[n][3]);
}
}
poj1837 Balance
状态压缩求方案数
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int k,n,f;
int dp[21][15100];
int h[21];
int w[21];
int main()
{
// freopen("input.txt","r",stdin);
scanf("%d%d",&f,&n);
for(int i=0;i<f;i++)
scanf("%d",&h[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
dp[0][7500]=1;
for(int i=1;i<=n;i++)
{
for(int k=0;k<=15000;k++)
{
if(dp[i-1][k])
{
for(int j=0;j<f;j++)
{
dp[i][k+h[j]*w[i]]+=dp[i-1][k];
}
}
}
}
printf("%d\n",dp[n][7500]);
}
poj1948 Triangular Pastures
n个线,组一个三角形,求三角形的最大面积。
海伦公式
,p为半周长
因为周长已知,知道两条边就能确定面积。
设dp[i][j](i>j),然后确定每一条边是否加入那个边,由已知状态推出未知状态,随之更新最大面积。
每条边不可能超过周长的一半。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int n;
int a[45];
int c;
int dp[1605][1605];
int aa[4];
// a+b>c-a-b
//
int check(int x,int y)
{
aa[0]=x;
aa[1]=y;
aa[2]=c-x-y;
if(aa[0]+aa[1]<aa[2]||aa[1]+aa[2]<aa[0]||aa[0]+aa[2]<aa[1])
return -1.0;
double t=c*1.0/2;
double ans=sqrt(t*(t-aa[0])*(t-aa[1])*(t-aa[2]))*100.0;
return ans;
// printf("%d %d %d %d\n",aa[0],aa[1],aa[2],(int)ans);
} int main()
{
// freopen("input.txt","r",stdin);
//printf("")
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
c+=a[i];
}
dp[0][0]=1;
int ans=-1.0;
for(int i=0;i<n;i++)
{
for(int j=c/2;j>=0;j--)
{
for(int k=c/2;k>=j;k--)
{
if(j>=a[i]&&dp[j-a[i]][k])
dp[j][k]=1;
if(k>=a[i]&&dp[j][k-a[i]])
dp[j][k]=1;
if(dp[j][k])
ans=max(ans,check(j,k));
// printf("%d\n",ans);
}
}
}
printf("%d\n",ans);
}
poj2923
待定
poj 01背包的更多相关文章
- (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 ...
- POJ 3624 Charm Bracelet (01背包)
题目链接:http://poj.org/problem?id=3624 Bessie has gone to the mall's jewelry store and spies a charm br ...
- POJ 3624 Charm Bracelet(0-1背包模板)
http://poj.org/problem?id=3624 题意:给出物品的重量和价值,在重量一定的情况下价值尽可能的大. 思路:经典0-1背包.直接套用模板. #include<iostre ...
- POJ 2151 Check the difficulty of problems 概率dp+01背包
题目链接: http://poj.org/problem?id=2151 Check the difficulty of problems Time Limit: 2000MSMemory Limit ...
- POJ 1112 Team Them Up! 二分图判定+01背包
题目链接: http://poj.org/problem?id=1112 Team Them Up! Time Limit: 1000MSMemory Limit: 10000K 问题描述 Your ...
- POJ.3624 Charm Bracelet(DP 01背包)
POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...
- POJ 2184 Cow Exhibition【01背包+负数(经典)】
POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ...
随机推荐
- mvc原理和mvc模式的优缺点
一.mvc原理 mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离.提高了程序的可维护性.可移植性.可扩展性与可重用性,降低了程序的开发难度.它主要分模型.视图.控制器三层. 1.模型 ...
- JSP脚本元素上机手册
L3 <JSP基础>上机手册 内容回顾 脚本元素<%! %> <%= %> <% %> 注释元素 JSP指令元素 JSP动作元素 上机目标 掌握脚本元素 ...
- android设置图片变化的四种效果代码
activity代码如下: package com.example.chapter12_graphic_animation; import android.os.Bundle; import andr ...
- C++中类的内存空间大小(sizeof)分析
注意类大小与结构体大小还是有一些不同的,类里面还包含成员函数(特别是虚函数),结构体中一般只有数据成员. 首先明确各数据类型占多大的空间.例如int到底是占2字节还是4字节空间: 在TC里,int是2 ...
- javascript在不同的浏览器处理事件
实现javascript事件处理兼容问题,例子如下,可以实现大部分浏览器处理事件的问题 var btn = document.getElementById("btn"); if(b ...
- 各种浏览器的agent信息(IE Chrome Safari Firefox)
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/53 ...
- ASP.NET MVC5 生成验证码
1 ValidateCode.cs using System; using System.Drawing; using System.Drawing.Drawing2D; using System.D ...
- IoC - Castle Windsor 2.1
找过一些Windsor教程的文章,博客园上TerryLee有写了不少,以及codeproject等也有一些例子,但都讲的不太明了.今天看到Alex Henderson写的一个系列,非常简单明了.下面是 ...
- 在linux中配置tomcat
Linux下Tomcat的安装配置 一.下载安装对应的jdk,并配置Java环境. 官网下载地址: http://www.oracle.com/technetwork/java/javase/down ...
- BZOJ NOI十连测 第一测 T1
思路:首先考虑t=1的情况,t等于1,那么所有位置的颜色相同,我们不用考虑概率的问题,那么,k+d*x在模d下都相等,我们考虑预处理一个数组s[i][j],代表d为i,起始位置为j的等差数列的和,这个 ...