POJ3624
有N个物品,分别有不同的重量Wi和价值Di,Bessie只能带走重量不超过M的物品,要是总价值最大,并输出总价值

//#include <bits/stdc++.h>
#include <iostream>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
using namespace std;
int dp[maxn];
int c[maxn];
int w[maxn];
int main()
{int n,m;while(cin>>n>>m){for(int i=0; i<n; ++i){cin>>c[i]>>w[i];}for(int i=0; i<n; ++i)for(int j=m; j>=c[i]; --j)dp[j]=max(dp[j],dp[j-c[i]]+w[i]);cout<<dp[m]<<endl;}return 0;
}

UVA562
给定n个硬币,要求将这些硬币平分以使两个人获得的钱尽量多,求两个人分到的钱最小差值。

#include <bits/stdc++.h>
#include <iostream>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const ll moad=1e9+7;
const int maxn=1e6+10;
int dp[maxn];
int w[maxn];
int vis[maxn];
int main()
{int t,n;cin>>t;while(t--){cin>>n;int sum=0;for(int i=0;i<n;++i)cin>>w[i],sum+=w[i];memset(dp,0,sizeof(dp));for(int i=0;i<n;++i){for(int j=sum/2;j>=w[i];--j){dp[j]=max(dp[j],dp[j-w[i]]+w[i]);}}int __=dp[sum/2],_;_=sum-__;cout<<abs(__-_)<<endl;}return 0;
}

HDU2546
这题看上去就知道是01问题了,可是开始怎么转化都没有转化为正确的01背包姿势
因为没有明显的给出来一个背包的容量(做完之后,看出来其实是给出来的,就是这个m-5),然后我wa的姿势是找所有物品的价值总和去作为容量
撒了一眼题解看是m-5,才知道可以用这个-5剩下的钱去01背包买更多的东西,最后加上那个5块钱去买加个最大的物品
这个5块好像用到了贪心的思想 mmp
总结:转化为正确的01问题姿势是关键

#include <bits/stdc++.h>
#include <iostream>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=1e6+10;
int dp[maxn];
int w[1005];
int main()
{int n,m;while(cin>>n,n){memset(dp,0,sizeof(dp));for(int i=0;i<n;++i) cin>>w[i];cin>>m;if(m<5){cout<<m<<endl;continue;}sort(w,w+n);int _now=m-5;for(int i=0;i<n-1;++i){for(int j=_now;j>=w[i];--j)dp[j]=max(dp[j],dp[j-w[i]]+w[i]);}cout<<m-(w[n-1]+dp[_now])<<endl;}return 0;
}
#include <bits/stdc++.h>
#include <iostream>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=1e6+10;
int dp[maxn];
int w[1005];
int main()
{int n,m;while(cin>>n,n){int ans=0;memset(dp,0,sizeof(dp));for(int i=0;i<n;++i) cin>>w[i],ans+=w[i];cin>>m;if(m<5){cout<<m<<endl;continue;}for(int i=0;i<n;++i){for(int j=ans;j>=w[i];--j)dp[j]=max(dp[j],dp[j-w[i]]+w[i]);}cout<<m-dp[ans]<<endl;}return 0;
}

HDU3466
先前得01背包问题都是占用多大空间,有多大空间就可以直接进行放入,而这个有个限制体条件
当容量低于特定值得时候就不可以放入,那这样进行放入得原则就是 需要的容量/本身占有得容量大小  这个值越小越好,所谓得性价比越高越好嘛
还有要注意的一点就是当 背包容量小于给的特定值得时候就不可以进行更新dp数组了

#include <bits/stdc++.h>
#include <iostream>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const ll moad=1e9+7;
const int maxn=1e6+10;
int q[maxn];
int c[maxn];
int w[maxn];
int dp[maxn];
struct node
{double c,q,w;
}point[maxn];
bool cmp(node a,node b)
{//return a.q-a.c<b.q-b.c;//return a.c*b.q<b.c*a.q;return a.q/a.c<=b.q/b.c;
}
int main()
{int n,m;while(cin>>n>>m){memset(dp,0,sizeof(dp));for(int i=0;i<n;++i)cin>>point[i].c>>point[i].q>>point[i].w;sort(point,point+n,cmp);
//           for(int i=0;i<n;++i)
//            cout<<point[i].c<<' '<<point[i].q<<' '<<point[i].w<<endl;for(int i=0;i<n;++i){for(int j=m;j>=point[i].q;--j){dp[j]=max(dp[j],dp[j-int(point[i].c)]+int(point[i].w));}}cout<<dp[m]<<endl;}return 0;
}

poj1745

给你n个数,经过加减的操作,看能不能整除K。
dp[i][j]代表前i个数字整除 m 的余数为 j

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define X 10005
using namespace std;
int main()
{int N,K;cin>>N>>K;int a[X];for(int i=1;i<=N;++i){scanf("%d",&a[i]);a[i]%=K;}int dp[X][K];memset(dp,0,sizeof(dp));//if(a[1]<0)//    a[1]+=K;a[1]=(a[1]+K)%K;dp[1][a[1]]=1;for(int i=2;i<=N;++i){for(int j=0;j<K;++j){if(dp[i-1][j]){/*  if(j+a[i]>=0)dp[i][j+a[i]]=1;elsedp[i][j+a[i]+K]=1;if(j>=a[i])dp[i][j-a[i]]=1;elsedp[i][j-a[i]+K]=1;*/dp[i][(j+a[i]+K)%K]=1;//保证下标大于0dp[i][(j-a[i]+K)%K]=1;}}}if(dp[N][0])cout<<"Divisible"<<endl;elsecout<<"Not divisible"<<endl;return 0;
}
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define X 10005
using namespace std;
long long POW(int a,int b)
{long long ans=1;while(b){if(b&1){ans*=a;}a*=a;b>>=1;}return ans;
}
int main()
{int N,K;cin>>N>>K;int a[X];for(int i=0;i<N;++i){scanf("%d",&a[i]);}long long n=POW(2,N-1);for(int i=0;i<n;++i){int sum=a[0];//cout<<a[0];for(int j=0;j<N-1;++j){if((i>>j)&1){//cout<<'-'<<a[j+1];sum+=a[j+1];}elsesum-=a[j+1];//,cout<<'+'<<a[j+1];}//cout<<'='<<sum<<"*****"<<sum%K<<endl;if(!(sum%K))//!的优先级比%的高{cout<<"Divisible"<<endl;return 0;}//cout<<endl;}cout<<"Not divisible"<<endl;return 0;
}
//这个方法是对的,可是在这儿N是10000算出来的n是2^10000会炸的

【常规的01背包 POJ3624 UVA562 HDU2546 HDU3466 poj1745】相关推荐

  1. dp之01背包hdu3466(带限制的,当你所拥有的钱数大于某个限定值时才可以购买该物品)...

    题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值. mark:又是变种01背包,每做一个变种的,就是一种提高.. 按照q - p以由大到小的顺 ...

  2. 暑假N天乐 —— 01背包及变形

    暑假集训的第一天 第二天了. 决定还是先把基础巩固一下好了,万一后面训练赛出事故更尴尬. 所以今天的主题是 -- 01背包及变形 动态规划概念 动态规划(Dynamic programming,DP) ...

  3. 01背包经典例题详解

    转载自点击打开链接 首先01背包题目的雏形是 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 从这个题目中可以看出,01背包的特点 ...

  4. 【背包专题】01背包

    暑假集训开始了,按照队里的分配,我是弄DP的,嘛,于是我又一次的开始了从01背包开始学习,昨天将杭电的几道01背包重新做了一遍,下面讲讲我自己对于01背包的理解. 首先01背包题目的雏形是 有N件物品 ...

  5. 【hdu4281状态压缩+01背包+多旅行商问题】

    题意:有n道题,每道题在二维平面内的不同位置且给出每道题的坐标,同时给出处理每道题所需的时间p,现在已知裁判的耐心有限,之会花费m个单位时间去做事,做完后回到起始点. 现在的要求是,我要多少个裁判才能 ...

  6. 01背包模板、全然背包 and 多重背包(模板)

    转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/ ...

  7. 问题 E: 序列操作Ⅰ(01背包)

    问题 E: 序列操作Ⅰ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选出若干个 ...

  8. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

  9. 01背包模板、完全背包 and 多重背包

    转载请注明出处:http://blog.csdn.net/u012860063 讲解链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121 ...

最新文章

  1. remote: HTTP Basic: Access denied
  2. Windows下创建PXE网络安装Linux[Redhat AS5.5]IBM X3650
  3. 微信tocken后台后台保存方法
  4. nRF52 SAADC 直接操作寄存器
  5. 安装两个硬盘时应如何跳线?
  6. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)码农网
  7. 相见恨晚!遗憾仅有不到1% 的人知道
  8. 网页设置页数/总页数_图书分配问题(分配最小页数)
  9. NBT | 微生物研究所王军组在AI赋能挖掘微生物组功能多肽方面获得新进展
  10. Openstack Python 源代码的路径
  11. Atitit 文档资料整理的规范流程与问题解决目录1. 减肥 11.1. 剥离非原创类文件 11.2. 去重 11.3. 转换格式 21.4. Topic主题剥离 22. 脱敏 2
  12. 如何给共享文件夹设置密码?共享文件夹加密的方法
  13. 1、【QT】QT6.2 官网下载与安装教程
  14. 心电监护仪数据图解_心电监护仪数据怎么看
  15. GRUB4DOS(十一) grldr可启动的软盘或硬盘分区的说明
  16. ASP.NET Development Server的Directory Browsing模式HTML垃圾代码
  17. 运行web项目提示异常:non-compatible bean definition of same name and class【com.xxx.xxx.XXX】
  18. 什么除酵节?什么是逾越节?
  19. linux配置限额超过7mb警告,centos7.x的磁盘限额配置
  20. vs2015 x86的Qt项目迁移到vs2017 x64平台

热门文章

  1. SQL Server 2008备份数据库失败,拒绝访问的原因
  2. Hibernate 双向一对一实现(基于annotation)
  3. 相对网站根目录寻址 vs 相对当前目录寻址
  4. 三重for循环优化_MATALB中对循环操作的优化
  5. 浅谈三级分销系统开发对企业的作用
  6. WWDC 2018:iOS 12 通知的新特性
  7. 微信非80端口网页授权
  8. mybatis-spring 项目简介
  9. (回文串)Manacher算法
  10. mongodb部署以及数据操作