HDU 1059 多重背包问题

问题大意:

有价值1-6的六种物品,分别规定其数目,问是否存在一种方法能使这些物品不拆分就能平均分给两个人

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5
 6 int v[7] , ans , k;
 7 int dp[500000];
 8 //0-1背包
 9 void zeroPack(int w , int v)
10 {
11     for(int i = ans ; i>=w ; i--)
12         dp[i] = max(dp[i] , dp[i - w]+v);
13 }
14 //完全背包
15 void compPack(int w , int v)
16 {
17     for(int i = w ; i<=ans ; i++)
18         dp[i] = max(dp[i] , dp[i - w]+v);
19 }
20 //多重背包
21 void multiPack(int n , int w , int v)
22 {
23     if(n*v > ans) compPack(w , v);
24     else{
25         int t = 1;
26         while(n >= t){
27             zeroPack(t*w , t*v);
28             n-=t;
29             t <<= 1;
30         }
31         if(n > 0) zeroPack(n*w , n*v);
32     }
33 }
34
35 int main()
36 {
37     int cas = 0;
38     while(1){
39         ans = 0;
40         k = 0;
41         for(int i = 0 ; i<6 ; i++){
42             scanf("%d" , v+i);
43             ans += v[i]*(i+1);
44         }
45         if(ans == 0) break;
46
47         if(ans & 1){
48             printf("Collection #%d:\n" , ++cas);
49             puts("Can‘t be divided.");
50             puts("");
51             continue;
52         }
53         ans >>= 1;
54         memset(dp , 0 , sizeof(dp));
55         for(int i = 0 ; i<6 ; i++){
56             multiPack(v[i] , i+1 , i+1);
57         }
58
59         if(dp[ans] == ans){
60             printf("Collection #%d:\nCan be divided.\n\n" , ++cas);
61         }
62         else printf("Collection #%d:\nCan‘t be divided.\n\n" , ++cas);
63     }
64     return 0;
65 }
时间: 2024-10-26 12:47:50

HDU 1059 多重背包问题的相关文章

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

hdu 1059 (多重背包) Dividing

这里;http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意是有价值分别为1,2,3,4,5,6的商品各若干个,给出每种商品的数量,问是否能够分成价值相等的两份. 联想到多重背包,稍微用二进制优化一下.(最近身体不适,压力山大啊) 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define inf 70000 5 using namespace s

HDU 2191多重背包问题、

1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<cstring> 5 const int qq=2000+50; 6 int v[qq],w[qq],dp[qq]; 7 using namespace std; 8 int main() 9 { 10 int t; 11 scanf("%d",&t); 12 while(t--){ 13 in

hdu 1059 多重背包

题意:价值分别为1,2,3,4,5,6的物品个数分别为a[1],a[2],a[3],a[4],a[5],a[6],问能不能分成两堆价值相等的. 解法:转化成多重背包 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 7 int dp[120010]; 8 int a[10]; 9 10 int

HDU 1059 Dividing(多重背包)

HDU 1059 Dividing(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意: 现在有价值为1,2,3,4,5,6的6种物品, 它们的数量为num[i]( 1<=i<=6 )个. 现在要问的是能否把所有的的物品分成两份且这两份物品的价值总和相同 ? 分析: 首先我们求出所有物品的价值和sum_val, 如果sum_val是奇数, 那么明显不能分. 那么sum_val为偶时, 我们令m=sum_val/2. 我能只要看看从所有

hdu(1059) Dividing(多重背包)

题意:输入六个数,价值分别为1——6,输入的数代表该价值的物品的个数:求能否平均分. key:如果奇数肯定不能分,直接输出答案.偶数的话,就是多重背包问题. 试过两种做法,第一种是背包九讲的二进制优化,写三个函数,分别是bag01, bagall, bagmulti~第二种是直接多重背包,但很可能tle,这题我交的就是tle了~ #include <iostream> #include <algorithm> #include <string.h> #include &

HDU ACM 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活-&gt;多重背包问题

分析:多重背包问题.这里直接转换为01背包,为使用二进制. #include<iostream> using namespace std; int price[101]; int weight[101]; int number[101]; int dp[101]; int main() { int C,n,m; int i,j,k; cin>>C; while(C--) { cin>>n>>m; for(i=0;i<m;i++) { cin>&g

hdu 1059 Dividing

题目: 链接:点击打开链接 题意: 判断是否能够平分弹珠. 算法: 多重背包. 思路: 模板...dp[i]中i表示花费.. 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n[7]; int dp[120010]; int V; void bag_01(int c,int w)//01背包 { for(int i=V; i>=c; i--) dp

hdu 2844 多重背包coins

http://acm.hdu.edu.cn/showproblem.php?pid=2844 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8909    Accepted Submission(s): 3580