请教各位大大一道题

永远的明日 2009-04-04 12:58:04
某木匠有N根木头,从中选出1根或以上木头,使其长度和能被某f整除
,输出有多少种取法
例:
输入:
3 2 //N 和f
1
1
2
输出:
3


谢谢··
...全文
130 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaienfr 2009-04-05
  • 打赏
  • 举报
回复
如果你接触过优化方面的理论,求解这个问题办法就有很多。可以自己写算法,也可以调用很多solver求解。

首先,你可以把问题描述成一个整数变量的规划问题
常数:
Li 是第i根木头长度。

变量:
xi ={0,1}
k 是整数

问题就是:
Li*xi = k*f
xi ={0,1}
k 是整数

接着可以用枚举法求出所有的解。(只要枚举0-1变量就行了)
虽然这个方法的复杂度是O(2^N),效率很低。
但是因为你的问题是求出所有的解,而不是求出一个可行解。
所以当N很大时,运算量大是很正常的,枚举发对这个问题是最简单且最容易实现的办法了。
lufy_sun 2009-04-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Netteans 的回复:]
3根木头 ,长度和被2整除 木头长度多少?
[/Quote]

题目说的是: f/n=0
  • 打赏
  • 举报
回复
3根木头 ,长度和被2整除 木头长度多少?
spirit_sheng 2009-04-05
  • 打赏
  • 举报
回复


#include <iostream>

using namespace std;

void slove(int N, int f, int *ls, int* rs)
{
if (N<=1)
{
for (int i=0; i<f; i++)
rs[i]=0;
if (N==1) rs[ls[0]%f]=1;
return;
}
int N1 = N/2;
int N2 = N-N1;
int * rs1 = new int[f];
int * rs2 = new int[f];
slove(N1, f, ls, rs1);
slove(N2, f, ls+N1, rs2);
for (int i=0; i<f; i++)
{
rs[i]=rs1[i]+rs2[i];
for (int j=0; j<f; j++)
rs[i] += rs1[j] * rs2[(f-j+i)%f];
}
delete [] rs1;
delete [] rs2;
}

int main()
{
int N, f;
cin >> N >> f;
int * ls = new int[N];
for (int i=0; i<N; i++)
cin >> ls[i];
int * rs = new int[f];
slove(N, f, ls, rs);
cout << rs[0] << endl;
delete [] rs;
delete [] ls;
return 0;
}
spirit_sheng 2009-04-05
  • 打赏
  • 举报
回复

动态规划, 原理如下:
把N个根木头对分成两组
每组计算出两个数组, int a[f], b[f];
a[i] 表示第一组中, 从中选出1根或以上木头, 其长度和能被某f所除的余数为i的取法数
b[i] 同理, 只不过, 表示第二组木头

那对于N根木头
c[i] = a[i] + b[i] + sum(a[j] * b[(f-j+i)%f]) ( 0<=j<f )

最后, c[0]即为所得


spirit_sheng 2009-04-05
  • 打赏
  • 举报
回复
都已经说了, 动态归划, 时间得杂度 O(N*f*f*logN)

永远的明日 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fairchild811 的回复:]
还是不是很明白楼主的意思。和楼主给的例子有点对不上

被f整除就是 %f == 0吧
[/Quote]
输入:
3 2 //N 和f ,接下来是木头的长度,例如1+1,1+1+2,2,三种情况能被2(即当前f)整除,输出3
1
1
2
输出:
3
fairchild811 2009-04-04
  • 打赏
  • 举报
回复
还是不是很明白楼主的意思。和楼主给的例子有点对不上

被f整除就是 %f == 0吧
永远的明日 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jzd8000 的回复:]
"使其长度和能被某f整除"这一句该怎么理解?
[/Quote]
选中的木头长度之和能被给定的某f整除
jzd8000 2009-04-04
  • 打赏
  • 举报
回复
"使其长度和能被某f整除"这一句该怎么理解?
spirit_sheng 2009-04-04
  • 打赏
  • 举报
回复
动态规划 计算长度除f余数的取法数
mengde007 2009-04-04
  • 打赏
  • 举报
回复
帮顶吧……

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧