设为首页 加入收藏

TOP

hdu 1709 The Balance (母函数)
2014-11-23 23:39:57 来源: 作者: 【 】 浏览:10
Tags:hdu 1709 The Balance 函数

/*

题目意思: 给你一个n,表示n个物品,下面有n个数,表示n个物品的重量,然后进行称量,每个物品只有一件,看不能称出的价值有几个,输出它,单独占一行,

当不为零时,输出所以不能称处的价值,并用空格隔开。。。

其中不能称出的价值包括:除(直接称出的)和(由直接称出的得出的差值)的剩余的价值。。ps:有点绕。。。

其实用dp更方便,但为了练习母函数!

*/

[html]
#include"stdio.h"
#include"string.h"
#define MAX 10008
int main()
{
int a[MAX],c1[MAX],c2[MAX],b[MAX];
int i,j,k,n,sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=0;i {
scanf("%d",&a[i]);
sum+=a[i];
}
for(i=1;i<=sum;i++)
{
b[i]=0;
c1[i]=c2[i]=0;
}
for(i=0;i<=1;i++)
c1[i*a[0]]=1;
for(i=1;i {
for(j=0;j<=sum;j++)
{
for(k=0;k*a[i]+j<=sum&&k<=1;k++)
c2[j+k*a[i]]+=c1[j];
}
for(j=0;j<=sum;j++)
{
c1[j]=c2[j];c2[j]=0;
}
}//母函数的过程
for(i=sum;i>0;i--)
{
if(c1[i])
{
for(j=1;j {
if(c1[j])
b[i-j]=1;
}
}
}//这里是把能有的差值用这种方式找出来
k=0;
for(i=1;i<=sum;i++)
{
if(!c1[i]&&!b[i])//将不能称出的价值存进c2中。。
c2[k++]=i;
}
printf("%d\n",k);
if(k)
{
for(i=0;i printf("%d ",c2[i]);
printf("%d\n",c2[i]);
}
}
return 0;
}


作者:yyf573462811
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中的几个容易混淆的知识点总.. 下一篇C数据结构:栈 功能:递推关系用..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: