hdu1059
2015-09-10 20:34
225 查看
链接:点击打开链接
题意:有六个物品价值分别为1~6,依次给出六个物品的数量,问是否能平均分成价值相等的两份
代码:
题意:有六个物品价值分别为1~6,依次给出六个物品的数量,问是否能平均分成价值相等的两份
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> //#define maxx(a,b) (a>b?a:b) using namespace std; int a[10],w[100005],dp[100005]; int main(){ int i,j,sum,cur,temp; cur=1; while(scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5])!=EOF,a[0]+a[1]+a[2]+a[3]+a[4]+a[5]){ memset(dp,0,sizeof(dp)); sum=temp=0; for(i=0;i<6;i++){ sum+=(a[i]*(i+1)); for(j=1;j<=a[i];j<<=1){ w[temp++]=j*(i+1); a[i]-=j; } if(a[i]>0) w[temp++]=a[i]*(i+1); //二进制分解,我推荐看下面这个博客 } //http://blog.csdn.net/lyhvoyage/article/details/8545852 printf("Collection #%d:\n",cur++); if(sum%2){ //sum为奇数时直接输出,并且不要忘记输出 printf("Can't be divided.\n\n"); //Collection #%d:这句话 continue; } sum/=2; for(i=0;i<temp;i++) //之后就可以转换问为01背包求解 for(j=sum;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+w[i]); if(dp[sum]==sum) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0; }
相关文章推荐
- CoreData
- 系统维护之CCleaner Pro 5.09 便携版|优秀系统清理工具
- Oracle 学习之 性能优化(十三) 索引
- MySql性能优化之分析命令
- Spring-MVC开发之全局异常捕获全面解读
- 用UITextView加载rtfd文件
- bundle的理解笔记
- Genymotion unable to load virtualbox engine 解决办法
- 效率相关笔记
- poj 1523 SPF 图论基础 图的割点
- 音乐播放器
- 十大相似图片搜索网站(以图搜图)
- 自定义字体方案
- 翻转名单
- DOCTYPE声明
- vim插件——ctags的安装和使用
- I Hate It(线段树)
- Activity中Menu相关的几个方法的调用时机
- SGU106 The equation(数论)
- Android webview 使用自定义自体