poj2392 1742多重背包
2015-10-16 13:12
183 查看
多重背包就是每组物品只能取有限多个
所以dp是要根据情况加一个if判断
首先按最大高度进行升序排序
另外加一个num 记录该数值已经取了多少个当前类型的block
1742 差不多
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
#include<queue>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =100005;
const int INF = 25000005;
int tol,n,m;
int dp[maxnum];
struct node
{
int v,num;
node(){}
node(int v1,int num1):v(v1),num(num1){}
}tp[maxnum];
int main()
{
//fstream fin("G:/1.txt");
//while(fin>>n>>m){
while(1){
scanf("%d%d",&n,&m);
if(n==0&&m==0)break;
ms(dp);ms(tp);
FOR(i,1,n){
scanf("%d",&tp[i].v);
//fin>>tp[i].v;
}
FOR(i,1,n){
scanf("%d",&tp[i].num);
//fin>>tp[i].num;
}
int num[maxnum];
dp[0]=1;
FOR(i,1,n){
ms(num);
FOR(j,tp[i].v,m){
if(!dp[j]&&dp[j-tp[i].v]&&num[j-tp[i].v]<tp[i].num){
dp[j]=1;
num[j]=num[j-tp[i].v]+1;
}
}
}
int sum=0;
FOR(i,1,m){
if(dp[i])sum++;
}
printf("%d\n",sum);
}
return 0;
}
所以dp是要根据情况加一个if判断
首先按最大高度进行升序排序
另外加一个num 记录该数值已经取了多少个当前类型的block
#include<iostream> #include <string> #include<vector> #include<algorithm> #include<set> #include<fstream> #include<cmath> #include<queue> using namespace std; #define lch(i) ((i)<<1) #define rch(i) ((i)<<1|1) #define sqr(i) ((i)*(i)) #define pii pair<int,int> #define mp make_pair #define FOR(i,b,e) for(int i=b;i<=e;i++) #define FORE(i,b,e) for(int i=b;i>=e;i--) #define ms(a) memset(a,0,sizeof(a)) const int maxnum =40005; const int INF = 25000005; int tol,n,m; int dp[maxnum]; struct node { int h,top,num; node(){} node(int h1,int top1,int num1):h(h1),top(top1),num(num1){} }; int cmp(node a,node b){ return a.top<b.top; } int main() { //fstream fin("G:/1.txt"); cin>>n; //fin>>n; vector<node> vec(n,node(0,0,0)); int u,v,w; FOR(i,1,n){ scanf("%d%d%d",&u,&v,&w); //fin>>u>>v>>w; vec[i-1].h=u; vec[i-1].top=v; vec[i-1].num=w; } sort(vec.begin(),vec.end(),cmp); dp[0]=1; int num[40005]; FOR(i,1,n){ ms(num); FOR(j,vec[i-1].h,vec[i-1].top){ if(!dp[j]&&dp[j-vec[i-1].h]&&num[j-vec[i-1].h]<vec[i-1].num){ dp[j]=1; num[j]=num[j-vec[i-1].h]+1; } } } int sum=vec[n-1].top; while(dp[sum]==0) sum--; cout<<sum; return 0; }
1742 差不多
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
#include<queue>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =100005;
const int INF = 25000005;
int tol,n,m;
int dp[maxnum];
struct node
{
int v,num;
node(){}
node(int v1,int num1):v(v1),num(num1){}
}tp[maxnum];
int main()
{
//fstream fin("G:/1.txt");
//while(fin>>n>>m){
while(1){
scanf("%d%d",&n,&m);
if(n==0&&m==0)break;
ms(dp);ms(tp);
FOR(i,1,n){
scanf("%d",&tp[i].v);
//fin>>tp[i].v;
}
FOR(i,1,n){
scanf("%d",&tp[i].num);
//fin>>tp[i].num;
}
int num[maxnum];
dp[0]=1;
FOR(i,1,n){
ms(num);
FOR(j,tp[i].v,m){
if(!dp[j]&&dp[j-tp[i].v]&&num[j-tp[i].v]<tp[i].num){
dp[j]=1;
num[j]=num[j-tp[i].v]+1;
}
}
}
int sum=0;
FOR(i,1,m){
if(dp[i])sum++;
}
printf("%d\n",sum);
}
return 0;
}
相关文章推荐
- C#使用回溯法解决背包问题实例分析
- 关于背包问题的一些理解和应用
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 背包问题
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法