您的位置:首页 > 其它

hdu - 1059 Dividing

2012-08-29 08:44 225 查看
多重背包问题,一般有三种思路优化:1.用2^n拆分数量,转化为01背包。2.当成完全背包来做,需要用一个数组记录每个物品的数量,当使用次数超过时结束。3.用单调队列优化(目前还不懂的说)。上次做男人八题里的coin时我用的是第二种思路,这次我用的是第一种。

#include <stdio.h>
#include <string.h>
bool dp[60006];
int a[10],b[100];
int cnt,sum;
bool read()
{
int i;
bool f = 0;
sum = 0;
for(i = 1; i <= 6; i++)
{
scanf("%d",&a[i]);
if(a[i]) f = 1;
sum += a[i]*i;
}
return f;
}
void inst(int n)
{
for(int i = 0; a
>= (1<<i); i++)
{
b[cnt++] = (1<<i)*n;
a
-= (1<<i);
}
if(a
) b[cnt++] = a
*n;
}
int main()
{
int i,j,cas=1;
bool ok;
while(read())
{
printf("Collection #%d:\nCan",cas++);
if(sum & 1)
{
printf("'t be divided.\n\n");
continue;
}
cnt = 0;
for(i = 1; i <= 6; i++)
inst(i);
sum /= 2; ok = 0;
memset(dp,0,sizeof dp);
dp[0] = 1;
for(i = cnt-1; i >= 0; i--)
{
if(dp[sum])
{ok = 1; break;}
if(b[i] > sum) break;
for(j = sum; j >= b[i]; j--)
if(dp[ j-b[i] ])
dp[j] = 1;
}
if(!ok) printf("'t");
printf(" be divided.\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: