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

目录
相关文章
人工智能 缓存 前端开发
6284 19
人工智能 JavaScript 开发工具
3252 4
缓存 JavaScript Shell
1551 1
开发工具 Swift git
1031 1
Shell API 调度
862 2
|
13天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
2115 121
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
|
14天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
1765 13
安全 机器人 API
599 2
缓存 人工智能 算法
704 1

热门文章

最新文章