自动分配位置的问题, 继续发问

littlechang 2008-01-08 04:42:50
一个节目在一个星期中的7天全部有节目,有10个企业要在节目中加广告,而每个企业中的广告投放的可能指定位置,也可能不指定位置,每个企业在哪几天投放广告也是可以自由的确定的,比如:
A 1 2 3 4 5 6 7
B 1 3 5 7
C 2 4 6 (+2)
D 1 2 3 4 5 6
E 1 2 3 4 5
F 3 (-1)
G 1 3 5


结果可以是:
A 1 2 3 4 5 6 7
C 2 4 6 (+2)
B 1 3 5 7
D 1 2 3 4 5 6
E 1 2 3 4 5
G 1 3 5
F 3 (-1)

也可以是:
D 1 2 3 4 5 6
C 2 4 6 (+2)
A 1 2 3 4 5 6 7
B 1 3 5 7
G 1 3 5
E 1 2 3 4 5
F 3 (-1)

(说明:其中的第一列字母为名称,后面的数字表示在一周的那一天有投放,后面(-1)表示指定了位置。)
等只要满足了指定了位置的条件,其他的可以任意的放置,而且只要能找到一个解就可以结束。
其中的指定位置是指该企业有投放的每一天从前向后数(正序位置)或从后向前数(倒序位置)为其指定的位置,显示的时候如上面那样显示出来。
如果后面指定了位置的情况下,在可满足其指定位置的情况下,是一定要满足的。
实际中的数据要会到30--50个,指定位置的数量和位置都不定。
...全文
243 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ojekleen 2008-01-09
  • 打赏
  • 举报
回复
select * from table;
int column=dt.column.cout;
DataRow dr=dt.newrow();
for(int i=0;i<dt.rows.count;i++)
{
int index=(int)dt.rows[i][column-1];
if(index!=0)
{
if(index>0)
{
//用数组保存当前值
dr=dt.rows[i];
dt.rows[i]=dt.rows[index];
dt.rows[index]=dr;
}
if(index<0)
{
//用数组保存当前值
dr=dt.rows[i]
index=dt.rows.count-index;
dt.rows[i]=dt.rows[index];
dt.rows[index]=dr;
}

}
}
ojekleen 2008-01-09
  • 打赏
  • 举报
回复
上面改为

select * from table;
int column=dt.column.cout;
DataRow dr=dt.newrow();
for(int i=0;i<dt.rows.count;i++)
{
int index=(int)dt.rows[i][column-1];
if(index!=0)
{
if(index>0)
{
//用数组保存当前值
dr=dt.rows[i];
dt.rows[i]=dt.rows[index];
dt.rows[index][0]=dr;
}
if(index<0)
{
//用数组保存当前值
dr=dt.rows[i]
index=dt.rows.count-index;
dt.rows[i]=dt.rows[index];
dt.rows[index][0]=dr;
}

}
}
//datarow 可能不允许==,你可以用其它方法。。意思就是这个。。dr.add()copyto()?什么之类的吧


ojekleen 2008-01-09
  • 打赏
  • 举报
回复
不知道你的数据是不是重数据库读取的?
你可以再建一个自动增长列ID。
A 1 2 3 4 5 6 7
B 1 3 5 7
C 2 4 6 (+2)
D 1 2 3 4 5 6
E 1 2 3 4 5
F 3 (-1)
G 1 3 5
这个改成没有的地方为0,没有确定位置的为0
1 A 1 2 3 4 5 6 7 0
2 B 1 0 3 0 5 0 7 0
3 C 0 2 0 4 0 6 0 2
4 D 1 2 3 4 5 6 0 0
5 E 1 2 3 4 5 0 0 0
6 F 0 0 3 0 0 0 0 -1
7 G 1 0 3 0 5 0 0 0

查询第一列和最后一列返回datatable dt;
循环获取dt每行的第二列的值。
判断:

/****不排除有手误
可以把下面的数组换成DataRow dr;
****/
int [] temp=new int[2];
for(int i=0;i<dt.rows.count;i++)
{
int index=(int)dt.rows[i][1];
if(index!=0)
{
if(index>0)
{
//用数组保存当前值
temp[0]=(int)dt.rows[i][0];temp[1]=(int)dt.rows[i][1];

dt.rows[i]=dt.rows[index];
dt.rows[index][0]=temp[0];dt.rows[index][1]=temp[1];
}
if(index<0)
{
//用数组保存当前值
temp[0]=(int)dt.rows[i][0];temp[1]=(int)dt.rows[i][1];
index=dt.rows.count-index;
dt.rows[i]=dt.rows[index];
dt.rows[i]=dt.rows[index];
dt.rows[index][0]=temp[0];dt.rows[index][1]=temp[1];
}

}
}



如果不是数据库你可以定义二维数组,效果同上。。没有编辑器,可能有错。。。
zhouxian0518 2008-01-09
  • 打赏
  • 举报
回复
不懂
andyhooo 2008-01-09
  • 打赏
  • 举报
回复
帮顶!
littlechang 2008-01-09
  • 打赏
  • 举报
回复
对h_w_king的回答:
1、A B C D...最多50个,穷举的办法可能是不行的,50也是不小的一个数字
2、指定位置的会比较少,如果总共有50个,指定位置的不会多于10个;+N一定会在-N的前面,这个是确定的
yuanmanguo 2008-01-09
  • 打赏
  • 举报
回复
期待楼上的
h_w_king 2008-01-09
  • 打赏
  • 举报
回复
对LZ的问题比较感兴趣, 有几个问题.
1:就LZ给的例子,ABCD... 最多会有多少? 若是少的话, 可以简单的采用穷举的方法, 最坏的时间复杂度为O(n!*n*lgn), 若是较大的话则不能采用.
2:对于ABCD...是较多的话. 对于指定位置的最多又会有多少? 关键是否(+N) 的是否一定在(-n)的前?(若是的话,已有思路)  若不一定,则问题会更复杂(还没搞定).
Efcndi 2008-01-09
  • 打赏
  • 举报
回复
除此之外,可以考虑在可行解的基础上进行最优化。

这个优化算法不能是一个搜索算法。(剪枝会剪去最优解)

想来想去,找不到合适的优化算法。希望其他人能够帮助你。
Efcndi 2008-01-09
  • 打赏
  • 举报
回复
昨天已经把代码发给你了。

只能找到可行解。找这个最优解需要计算能力很强的计算机。
大正他爹 2008-01-09
  • 打赏
  • 举报
回复
帮你顶下!~~~希望你早点解决!~
zmaini1420 2008-01-09
  • 打赏
  • 举报
回复
帮你顶下!~~~希望你早点解决!~
h_w_king 2008-01-09
  • 打赏
  • 举报
回复
工程已上传,  http://download.csdn.net/source/329988
写的更能有点乱,
输入时,对于(+n)的要从小往大的输入,即(2) (4) (5).... 
对于(-n)的一样,即或(-2) (-3) (-4)....
自己只做了简单的测试, 因时间关系没有好好完善,写了些注解,

简单的思路就是先对(+n)的元素进行处理, 取最前的, 看它前面是否要插入,如需则从没限制的元素中取
每次插入的记录都进棧,以备出错时回退.结果送到OkQarr
完成后再对(-n)的处理,原理一样,只是当回到是(+n)的元素时要再处理上一步.结果送到OkHarr

最后输出,先从前到后输出OkQarr 再输出没有用到的那些没限制的元素 最后从后向前输出OkHarr

qinxinfo 2008-01-08
  • 打赏
  • 举报
回复
10个企业是否每个企业都必投?
节目的位置有几个?
hgs5945 2008-01-08
  • 打赏
  • 举报
回复
UP
littlechang 2008-01-08
  • 打赏
  • 举报
回复
我没有明白你还有哪些地方不明白,可以参考我的上一帖
http://topic.csdn.net/u/20080105/18/0ba81f19-8ec3-42ce-af1f-1026c12a02eb.html?seed=2106729441
yuexiaxiaochongzi 2008-01-08
  • 打赏
  • 举报
回复
企业数量,广告位置,等信息呢?让LZ吃了?
ojekleen 2008-01-08
  • 打赏
  • 举报
回复
貌似数字没什么用?是不是只关正负的关系?
排序?
littlechang 2008-01-08
  • 打赏
  • 举报
回复
实际中是一定可以满足条件的,因为广告投放比较多,而有指定位置的相对很少
h_w_king 2008-01-08
  • 打赏
  • 举报
回复
如果无法满足条件怎么办?
加载更多回复(2)

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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