hdu1059Dividing

简介: 题意:有6种石头,价值分别是1,2,3,4,5,6   每种有若干,作为输入数据。问能否把这些石头按照价值均分? 分析:多重背包问题。 代码: View Code 1 #include 2 #include 3 #include 4 using namespace...

题意:有6种石头,价值分别是1,2,3,4,5,6   每种有若干,作为输入数据。问能否把这些石头按照价值均分?

分析:多重背包问题。

代码:

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 const int MAXN = 60000 + 5;
 6 int dp[MAXN], n[6];
 7 int main(){
 8     int i, j, k;
 9     int cas = 0;
10     while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6])!=EOF){
11         int sum=n[1]+n[2]*2+n[3]*3+n[4]*4+n[5]*5+n[6]*6;
12         if(!sum) break;
13         printf("Collection #%d:\n", ++cas);
14         if(sum%2) {
15             printf("Can't be divided.\n\n");
16             continue;
17         }
18         for(i=0; i<MAXN; i++) dp[i]=0;
19         int v=sum>>1;
20         for(i=1; i<=6; i++){
21             for(k=1; n[i]; k<<=1){
22                 if(n[i]<k) k=n[i];
23                 for(j=v; j>=k*i; j--)
24                     if(dp[j]<dp[j-k*i]+k*i) dp[j]=dp[j-k*i]+k*i;
25                 n[i]-=k;
26             }
27         }
28         if(dp[v]==v) printf("Can be divided.\n\n");
29         else printf("Can't be divided.\n\n");
30     }
31 }

发现如果用max()函数会比较慢,改用if判断来更新dp值的时候会快0.6秒左右~

不过如果输入数据a[i]mod30后会0ms就ac 我表示很不解:

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 const int MAXN = 60000 + 5;
 6 int dp[MAXN], n[6];
 7 int main(){
 8     int i, j, k;
 9     int cas = 0;
10     while(true){
11         int sum = 0;
12         for(i=1; i<=6; i++){
13             scanf("%d", &n[i]);
14             n[i]%=30;
15             sum+=n[i]*i;
16         }
17         if(!sum) break;
18         printf("Collection #%d:\n", ++cas);
19         if(sum%2) {
20             printf("Can't be divided.\n\n");
21             continue;
22         }
23         for(i=0; i<MAXN; i++) dp[i]=0;
24         int v=sum>>1;
25         for(i=1; i<=6; i++){
26             for(k=1; n[i]; k<<=1){
27                 if(n[i]<k) k=n[i];
28                 for(j=v; j>=k*i; j--)
29                     if(dp[j]<dp[j-k*i]+k*i) dp[j]=dp[j-k*i]+k*i;
30                 n[i]-=k;
31             }
32         }
33         if(dp[v]==v) printf("Can be divided.\n\n");
34         else printf("Can't be divided.\n\n");
35     }
36 }

至于剪枝我还没有去想过,这里的代码可以参考下http://liangguoqiu.diandian.com/post/2010-04-29/40038525181

目录
相关文章
|
缓存 机器人 网络安全
steam报错“您对 CAPTCHA 的响应似乎无效。请在下方重新验证您不是机器人”
你是否满怀期待地准备加入 Steam 的大家庭,却被烦人的 CAPTCHA 验证拦在了门外? 😫 “您对 CAPTCHA 的响应似乎无效。请在下方重新验证您不是机器人。” 这句冰冷的提示,仿佛在嘲笑你的努力,即使反复尝试,错误依然顽固地存在,让人抓狂!🤯 别担心,你不是一个人!很多小伙伴在初次接触 Steam 时,都会遇到这个令人头疼的问题。
|
存储 算法 关系型数据库
【高阶数据结构】 B树 -- 详解
【高阶数据结构】 B树 -- 详解
|
机器学习/深度学习 数据挖掘 Go
Go用来做数据科学---goplus
Go用来做数据科学---goplus
471 0
Go用来做数据科学---goplus
|
弹性计算 运维 Cloud Native
阿里云计算巢加速器:让优秀的软件生于云、长于云—附—加码企业服务,阿里云发布计算巢加速器
阿里云计算巢加速器:让优秀的软件生于云、长于云—附—加码企业服务,阿里云发布计算巢加速器
307 0
|
弹性计算 安全 Linux
实践出真知!ECS使用体验。
记录ECS的使用体验,分享交流,当然,最最最重要的还是为了白嫖两个月服务器啦哈哈。
172 0
实践出真知!ECS使用体验。
|
XML 数据格式
FileProvider使用以及源码浅析
FileProvider使用以及源码浅析
FileProvider使用以及源码浅析
|
存储 开发工具 C++

热门文章

最新文章