| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 326 人关注过本帖
标题:新贴,不问小问题了,直接求一个代码。
只看楼主 收藏
莹幸儿
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2018-3-23
结帖率:40%
  已结贴   问题点数:50  回复次数:12   
新贴,不问小问题了,直接求一个代码。
现有32张选票,选票上是4个竞选人的人名,假定为甲乙丙丁。每张选票至少选择一个竞选人,至多选择三个竞选人。
已知甲获得了20票,乙获得了24票,丙获得了16票,丁得了18票。
请求出所有选票的情况。
2018-04-14 19:23
ab1412
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:37
专家分:134
注 册:2018-3-15
  得分:15 
程序代码:
#include<STDIO.H>
int main()
{
    int i,j,k;  //分别代表选了1,2,3个人的选票
    for (k=0;k<=32;k++)
    {
        for (j=0;j<=32;j++)
        {
            for(i=0;i<=32;i++)
            {
                if ((i+j+k==32)&&(3*k+2*j+i==78))
                {
                    printf("有%d张投了三票,%d张投了两票,%d张投了一票.\n",k,j,i);
                }
            }
        }
    }
    return 0;
}

emmmm说实话没看懂题目,我个人理解的话是这样的代码...不知道是不是你需要的
2018-04-14 20:32
莹幸儿
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2018-3-23
  得分:0 
回复 2楼 ab1412
你回答了有多少张三票的有多少两票的,多少一票的。但是没有求出每张票的具体情况。
我们做这样一个假设。我在网上让32个人投票,四选三,但是有些人没有选三个,但是我知道他们都选了。、
这个时候我想要把纸质的选票打印出来,然后根据程序模拟出的所有情况中选择一种自己填写。
大概这个样子的功能
2018-04-14 21:00
nosnoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:181
注 册:2016-9-17
  得分:0 
老人,就不贴代码了,直接拿点经验走人
2018-04-14 21:48
九转星河
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:长长久久
等 级:版主
威 望:36
帖 子:4482
专家分:12673
注 册:2016-10-22
  得分:15 
差点还以为和200块零钱那贴挺类似的~然后细看可以这样~
总共选3轮,第一次每个人都要选,然后第二第三次就没规定了~

第一轮的甲乙丙丁分别对应x1 y1 z1 w1这样就有

x1+y1+z1+w1=32
0<=x1<=20
0<=y1<=24
0<=z1<=16
0<=w1<=18

第二轮可以
0<=x2<=20-x1
0<=y2<=24-y1
0<=z2<=16-z1
0<=w2<=18-w1

第三轮之后要满足各个选票情况~
于是有
x3=20-x1-x2
y3=20-y1-y2
z3=16-z1-z2
w3=18-w1-w2

由于有前面的约束关系得出这个是定值,这样就就可以不用看第三轮选举的情况了~

把前面两轮选举合并化简一下~
于是有

x1>=0
y1>=0
z1>=0
x2>=0
y2>=0
z2>=0

x1+x2<=20
y1+y2<=24
z1+z2<=16
x1+y1+z1-w2 >=14  //  (    x1+y1+z1+w1=32  ->   x1+y1+z1<=32  )  AND  32-x1-y1-z1+w2<=18   

满足该约束条件时有
w1=32-x1-y1-z1
x3=20-x1-x2
y3=24-y1-y2
z3=16-z1-z2
w3=14-x1-y1-z1-w2

根据上面的约束关系其实只要满足存在自然数



x1+y1+z1>=14

就可以得到结果~
这样就有

x2+x3=20-x1
y2+y3=24-y1
z1+z2=16-z1
w1=32-x1-y1-z1
w2+w3=x1+y1+z1-14

这样确定x1 y1 z1后就可以把约束关系分离出来了~

得到结果集再对选票进行合理的填充即能得到每张选票的情况~

[此贴子已经被作者于2018-4-16 04:21编辑过]


[code]/*~个性签名:我[爱][你]==你[爱[我]]; 就是这样~ 2018-04-02更~*/[/code]
7 天前 01:21
莹幸儿
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2018-3-23
  得分:0 
回复 5楼 九转星河
这个回答很详细了,不过这个代码会不会太繁琐
7 天前 20:52
九转星河
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:长长久久
等 级:版主
威 望:36
帖 子:4482
专家分:12673
注 册:2016-10-22
  得分:0 
回复 6楼 莹幸儿
感觉是先满足32张选票每人先选一张,然后再分别填满甲乙丙丁这样比较好~
如果选票已经选满3张了那么选丁的时候就跳过该选票就是了,这个组合方案挺多的也算是挺难构造比较全面的算法,但可以分开一步一步来,第一先枚举所有选一张选票的情况,然后在前面的基础上再分四次分别枚举选满甲乙丙丁的情况~
每张选票共有14种可行的情况,那么32张选票共有14的32次方种情况,这样,感觉找到一种可行的情况就可以了~

[code]/*~个性签名:我[爱][你]==你[爱[我]]; 就是这样~ 2018-04-02更~*/[/code]
6 天前 07:40
莹幸儿
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2018-3-23
  得分:0 
回复 7楼 九转星河
能给我一个代码吗感觉我自己编不出来,溢出了
6 天前 13:34
九转星河
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:长长久久
等 级:版主
威 望:36
帖 子:4482
专家分:12673
注 册:2016-10-22
  得分:10 
回复 8楼 莹幸儿
这个需求我也放了,我知道自己实现所需的时间太多而且能不能弄出来也是个未知数~
这还只是其次,重点的是具体要列出所有选票的情况~因为符合条件的情况实在太多~

还有这题目不知道是从哪里来的,如果是作业那就算了(如果这真的是作业那么等标准答案好了),如果不是那就要看看具体需求再提出具体解决方案(毕竟不是所有题目要求都是合理的)~

[code]/*~个性签名:我[爱][你]==你[爱[我]]; 就是这样~ 2018-04-02更~*/[/code]
6 天前 18:47
莹幸儿
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2018-3-23
  得分:0 
回复 9楼 九转星河
这是一个现实问题,方案却是很多,不过编程对的话,方案再多也是电脑算呀。关键我找不到方法
6 天前 18:56







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.191174 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved