JOJ_1026

本文探讨了一种特定的组合问题,即求解x1+x2+...+xr=n的正整数解个数,其中x1到xr为互异的正整数。介绍了两种解法,包括0/1背包问题的应用及动态规划方法,并提供了三种逐步优化的代码实现。

P1026  题目大意:求x1+x2+……xr=n解的个数(其中x1,x2,……xr为互异的正整数,r>=2)

  解法一:把1,2,3……n-1作为n-1个物品,0/1背包即可

  解法二:f[i][j]为共i块砖,其中第一列(最小一列摆j块)的方案数代码

      代码_1:

  f[i][j]=sum{f[i-j,k]} (j<i;j+1<=k<=i);
  边界 f[i][i]=1; (1<=i<=i-1);
      代码_2:在_1的基础上时间优化,但编程复杂度增加
  考虑到f[i][j]=0;(j>i/2若i为奇数;j>=i/2若i为偶数)且f[i][i]=1; (1<=i<=i-1);
可修改j,k的上限

      代码_3:在_2的基础上的小优化 (x-1)/2避免对x奇偶的讨论

引用:http://blog.youkuaiyun.com/jcwkyl/article/details/3016830

启示:看题解尽量先不看题解代码,如若看题解代码看不懂时大可以先按照思路自己编,然后对比。

(就像这题看了题解一开始很纠结/2的问题,不知不觉优化到了题解一样)

_1:

for (i=1;i<n;i++) f[i][i]=1;
for (i=3;i<=n;i++)
for (j=1;j<i;j++)
 for (k=j+1;k<=i-j;k++)
f[i][j]+=f[i-j][k]; 
  

_2:

for (i=1;i<n;i++) f[i][i]=1;

 for (i=3;i<=n;i++)

   for (j=1;j<=i/2;j++)

{     for (k=j+1;k<=(i-j)/2;k++)
f[i][j]+=f[i-j][k];
         if (j!=2*i) f[i][j]++;
}

_3:

for (i=1;i<n;i++) f[i][i]=1;
  for (i=3;i<=n;i++)
    for (j=1;j<=(i-1)/2;j++)
{ for (k=j+1;k<=(i-j-1)/2;k++)
     f[i][j]+=f[i-j][k];
  f[i][j]++;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值