HDU 1059 Dividing 多重背包 .
2016-10-02 16:12
465 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1059
二进制优化
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int num[7];
bool d[80000+5];
int main(int argc, char const *argv[])
{
int kase=0;
for(;;)
{
int sum=0;
for(int i=1;i<=6;i++){
scanf("%d",&num[i]);
sum+=num[i]*i;
}
if(sum==0) break;
if(sum%2) {
printf("Collection #%d:\nCan't be divided.\n\n",++kase);
continue;
}
int half=sum/2;
memset(d,false,sizeof(d));
d[0]=true;
for(int i=1;i<=6;i++)
{
if(num[i]==0) continue;
int n=num[i],k=1;
if(n*i>=half){
for(int j=i;j<=half;j++)
if(d[j-i]) d[j]=true;
continue;
}
while(n>k)
{
for(int j=half;j>=k*i;j--)
if(d[j-k*i]) d[j]=true;
n-=k; k<<=1;
}
for(int j=half;j>=n*i;j--)
if(d[j-n*i]) d[j]=true;
n-=k; k<<=1;
}
printf("Collection #%d:\n%s\n\n",++kase,d[half]?"Can be divided.":"Can't be divided.");
}
return 0;
}
二进制优化
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int num[7];
bool d[80000+5];
int main(int argc, char const *argv[])
{
int kase=0;
for(;;)
{
int sum=0;
for(int i=1;i<=6;i++){
scanf("%d",&num[i]);
sum+=num[i]*i;
}
if(sum==0) break;
if(sum%2) {
printf("Collection #%d:\nCan't be divided.\n\n",++kase);
continue;
}
int half=sum/2;
memset(d,false,sizeof(d));
d[0]=true;
for(int i=1;i<=6;i++)
{
if(num[i]==0) continue;
int n=num[i],k=1;
if(n*i>=half){
for(int j=i;j<=half;j++)
if(d[j-i]) d[j]=true;
continue;
}
while(n>k)
{
for(int j=half;j>=k*i;j--)
if(d[j-k*i]) d[j]=true;
n-=k; k<<=1;
}
for(int j=half;j>=n*i;j--)
if(d[j-n*i]) d[j]=true;
n-=k; k<<=1;
}
printf("Collection #%d:\n%s\n\n",++kase,d[half]?"Can be divided.":"Can't be divided.");
}
return 0;
}
相关文章推荐
- HDU 1059 Dividing(多重背包)
- HDU 1059 Dividing 多重背包
- hdu 1059 Dividing 多重背包
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- hdu 1059 Dividing(多重背包)
- hdu 1059 Dividing ——多重背包复习
- hdu 1059 Dividing 多重背包
- HDU 1059 Dividing(多重背包)
- HDU 1059 Dividing 多重背包
- hdu 1059 Dividing 多重背包
- hdu 1059 Dividing 多重背包
- Dividing (HDU 1059) —— 多重背包
- HDU - 1059 Dividing(完全背包+多重背包)
- 【多重背包】HDU 1059 Dividing
- HDU 1059 Dividing 多重背包
- HDU1059-Dividing-DP(多重背包)
- hdu-1059-Dividing(多重背包+二进制优化)
- hdu 1059 Dividing(多重背包)
- hdu1059 Dividing ——多重背包
- HDU 1059 Dividing 多重背包