hdu 1059 Dividing

来源:互联网 发布:淘宝男装店铺排行榜 编辑:程序博客网 时间:2024/05/21 22:47

        题意:有一些价值为1~6的大理石,问两个人能不能分到总价值一样的石头。

        思路:dp(类似01背包)。把可以取到的值标记起来,需要稍作优化。


#include<cstdio>#include<iostream>#include<algorithm>#include<string.h>#include<string>using namespace std;int a[7];bool dp[120010];int main(){int cas=0;while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]){cas++;int sum=0;for(int i=1;i<=6;i++){sum+=a[i]*i;}if(sum==0)break;if(sum&1){printf("Collection #%d:\n",cas);printf("Can't be divided.\n\n");continue;}memset(dp,0,sizeof(dp));dp[0]=1;int end=0;for(int i=1;i<=6;i++){if(a[i])for(int j=end;j>=0;j--){int tmp=a[i];if(dp[j]){while(tmp--){dp[j+i*(tmp+1)]=1;}}}if(dp[sum/2])break;end=end+i*a[i];}if(dp[sum/2]){printf("Collection #%d:\n",cas);printf("Can be divided.\n\n");}else{printf("Collection #%d:\n",cas);printf("Can't be divided.\n\n");}}return 0;}


0 0
原创粉丝点击