[多重背包+二进制优化]HDU1059 Dividing

题目链接

题目大意:

两个人要把一堆宝珠,在不能切割的情况下按照价值平分,他们把宝珠分成6种价值,每种价值的宝珠n个。 n<=200000

思考:

首先如果加和下来的价值是一个偶数 那么还分毛啊,直接gg.

之后多重背包二进制优化 转换为 01背包。

我们可以把价值 同时当做宝珠的空间和价值。

那么我们现在要求的是 在 空间为一半的情况下,能否找到价值为 一半的情况。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 int dp[200005],n[7],V[105],W[100];
 5
 6 int main(){
 7     int k=0;
 8     while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6])!=EOF && (n[1]||n[2]||n[3]||n[4]||n[5]||n[6])){
 9         printf("Collection #%d:\n",++k);
10         int i,j,sum=0,mid;
11         for(i=1;i<=6;i++) sum+=i*n[i];
12         if(sum%2){
13             printf("Can‘t be divided.\n\n");
14             continue;
15         }
16         else mid = sum/2;
17         memset(dp,0,sizeof(dp));  //切记不要忘了初始化
18         int count=0,temp,flag=1;
19         //这块是二进制优化
20         for(i=1;i<=6;i++){
21             temp=1;
22             while(n[i]>=temp){
23                 V[++count]=i*temp;
24                 W[count]=i*temp;
25                 n[i]-=temp;
26                 temp*=2;
27             }
28             if(n[i]>0){
29                 V[++count]=i*n[i];
30                 W[count]=i*n[i];
31             }
32         }
33         //上面是二进制优化
34         for(int i=1;i<=count && flag;i++)
35             for(int j=mid;j>=V[i] && flag;j--){
36                 dp[j] = std::max(dp[j],dp[j-V[i]]+W[i]);
37                 if(dp[j]==mid){
38                     printf("Can be divided.\n\n");
39                     flag=0;
40                 }
41             }
42         if(flag){
43             printf("Can‘t be divided.\n\n");
44         }
45     }
46     return 0;
47 }

代码实现

时间: 2024-10-24 12:46:39

[多重背包+二进制优化]HDU1059 Dividing的相关文章

hdu1059 dp(多重背包二进制优化)

hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听过```不得不吐槽自己的知识面太窄```于是,我用了母函数写这题,母函数的做法并没有问题,但是由于这道题的数据很大,母函数轻轻松松就超时了,于是,我又很努力地在母函数循环的优化上面想出路,改改改,各种改之后依旧TLE,01背包的做法显然也是会超时的,DISCUSS里的母函数做法优化方式都是模上一个大

HDU 1059 多重背包+二进制优化

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16909    Accepted Submission(s): 4729 Problem Description Marsha and Bill own a collection of marbles. They want to split the collection

14年省赛---多重部分和问题(多重背包+二进制优化)

1210: F.多重部分和问题 时间限制: 1 Sec  内存限制: 64 MB提交: 18  解决: 14 题目描述 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. 输入 首先是一个正整数T(1<=T<=100)接下来是T组数据 每组数据第一行是一个正整数n(1<=n<=100),表示有n种不同大小的数字 第二行是n个不同大小的正整数ai(1<=ai<=100000)第三行是n个正整数mi(1<=mi<=100000

台州 OJ 2537 Charlie&#39;s Change 多重背包 二进制优化 路径记录

描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically the setup of your next task. Your program will be given numbers

POJ 1014 Dividing 【DP 之 多重背包 / 二进制优化】

Language: Default Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63647   Accepted: 16488 Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal

POJ 1014 Dividing【多重背包+二进制优化】

大意: 价值1, 2, 3, ……, 6的物品分别a1, a2, ……, a5, a6件 问能否把这些物品分成两份,使其具有相同的价值(所有物品必须全部用上) 分析: 给个物品有多件,即多重背包 只要看能不能将这些物品拼成   总价值 的 一半就可以了 转化为01背包是用二进制优化,否则会超时 代码: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std;

POJ 1014 Dividing(多重背包+二进制优化)

http://poj.org/problem?id=1014 题意:6个物品,每个物品都有其价值和数量,判断是否能价值平分. 思路: 多重背包.利用二进制来转化成0-1背包求解. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cstdio> 5 #include<algorithm> 6 using namespace std; 7 8 const i

HDU 2191 悼念512【多重背包+二进制优化】

大意分析: 多重背包,转化为01背包即可 可以用二进制进行优化 代码:(代码没有优化,下题是优化才可过的) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int maxn = 105; 7 8 int n, m, tot; 9 int p[2005], h[2005]; 10 int dp[maxn]; 11 int solv

POJ 1276 Cash Machine 多重背包--二进制优化

点击打开链接 Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28337   Accepted: 10113 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount