HDU 1059 Dividing【多重背包】
2018-02-03 19:01
274 查看
题目链接
题目意思
现在有很多的弹珠,每个弹珠都有一个1~6的价值,现在要将这些弹珠分成价值相同的两部分,问你能不能分开。解题思路
这就是一个典型的多重背包题,给你了弹珠的价值和重量,就问你能不能分成价值相同的两部分。为了防止超时,我们要进行二进制优化。代码部分
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> using namespace std; const int maxn=100100; int a[10]; int dp[maxn]; int val[maxn],weight[maxn],num[maxn]; int temp,k; void ZeroOnePack(int nweight,int nvalue) { for(int j=temp; j>=nweight; j--) { dp[j]=max(dp[j],dp[j-nweight]+nvalue); } } void CompletePack(int nweight,int nvalue) { for(int j=nweight; j<=temp; j++) { dp[j]=max(dp[j],dp[j-nweight]+nvalue); } } void MultiplePack() { k=1; int ncount=0; for(int i=1; i<7; i++) { if(a[i]*i>=temp) { CompletePack(i,i); } else { k=1; ncount=a[i]; while(k<=ncount) { ZeroOnePack(k*i,k*i); ncount-=k; k*=2; } ZeroOnePack(ncount*i,ncount*i); } } } int main() { int cas=0; int sum; while(1) { cas++; sum=0; for(int i=1; i<7; i++) { scanf("%d",&a[i]); sum+=a[i]*i; } if(sum==0) break; if(sum%2==1) { printf("Collection #%d:\nCan't be divided.\n\n",cas); continue; } else { temp=sum/2; memset(dp,0,sizeof(dp)); MultiplePack(); if(dp[temp]==temp) { printf("Collection #%d:\nCan be divided.\n\n",cas); } else { printf("Collection #%d:\nCan't be divided.\n\n",cas); } } } return 0; }
相关文章推荐
- ACM学习历程—HDU 1059 Dividing(dp && 多重背包)
- HDU1059 && POJ1014 :Dividing(多重背包)
- hdu 1059 Dividing 多重背包
- hdu 1059 Dividing 多重背包
- hdu1059 Dividing (多重背包)
- HDU 1059 Dividing (多重背包+二进制优化)
- hdu 1059 Dividing (多重背包详解)
- poj1014 hdu1059 Dividing 多重背包
- [0-1背包]HDU 1059 Dividing
- HDU 1059 Dividing 多重背包
- HDU 1059 Dividing 多重背包 .
- [HDU 1059] Dividing (多重背包+二进制优化)
- HDU1059_Dividing【多重背包】【二进制】
- hdu1059 Dividing (多重背包)
- HDU-1059 Dividing 多重背包
- HDU 1059 Dividing (多重背包问题)
- HDU 1059 Dividing 【DP背包】
- HDU-1059 Dividing (多重背包 二进制优化+剪枝)
- HDU-1059 Dividing(多重背包)
- hdu1059 Dividing(多重背包二进制优化)