您的位置:首页 > 其它

poj 1041-Dividing解题报告-可行性背包问题

2012-05-15 23:58 344 查看
题意是说,给一些大理石,每种有num[i]个,判断能否分成两部分,可行性问题,感觉不像是动态规划,中间没有最优子结构这个性质,倒像是纯粹的递推

View Code

#include<stdio.h>
#include<string.h>
#define N 60005
int bag[7];
int v
;
bool dp
;
int main()
{
int sum;
int i,j,k,ans;
int icase=1;
while(1)
{
sum=0;
for(i=1;i<=6;i++)
{
scanf("%d",&bag[i]);
sum+=bag[i]*i;
}
if(!sum)
break;
printf("Collection #%d:\n",icase++);
if(sum&1)
{
printf("Can't be divided.\n\n");
continue;
}
memset(dp,0,sizeof(dp));
ans=sum>>1;
k=0;
for(i=1;i<=6;i++)
{
j=1;
while(j<=bag[i])
{
bag[i]-=j;
v[k++]=j*i;
j<<=1;
}
if(bag[i])
v[k++]=bag[i]*i;
}
dp[0]=true;
for(i=0;i<k;i++)
for(j=ans;j>=v[i];j--)
if(dp[j-v[i]])
dp[j]=true;
if(dp[ans])
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: