求更好的实现方法,谢谢!
我这个写法实在是太烂了,求指点!谢谢!
###点我直接改代码
package main
import (
"fmt"
"sort"
)
func main() {
sum := 1159
res := make(map[int][]int)
var fin []int
for i := 0; i < 12; i++ {
for j := 0; j < 6; j++ {
tmp := sum - 99*i - 199*j
if tmp > 0 && tmp < 100 {
res[tmp] = []int{i, j}
fin = append(fin, tmp)
}
}
}
sort.Ints(fin)
fmt.Println(fin[0])
fmt.Println(res[fin[0]])
}
有疑问加站长微信联系(非本文作者)

另外,你这个算法有问题,1和5的值为 99+5*199=1094,相差65,我这个算出的是: x= 0 , y= 6 , 最接近的值为: 1194 差值为: 35
谢谢指出! 实际的需求是这样的,准备注销小招行的信用卡,但是信用卡中还有1159积分,刚好看到可以捐给 贫困/疾病/缺书 的孩子,为了获得最优比,就想这个用很少有机会使用的 go语言 来算一下,怎样才能充分利用这个积分,尽量少一点儿捐给银行!
所以,必须保证 最优比 的值,小于等于 1159
再次感谢您的回复和代码! 已认真阅读您的代码!谢谢!
建议把 else 改用 continue
x99+199y = 100x+200y-(x+y) x+2相当于y+1 如果最终答案是需要result <= 1159的话 因为x<= 11,y<=5, 要让100x+200y=1100 and x+y最小 所以x+y最小的情况是y最大,即x=1,y=5
所以如果x99+y199这个公式固定且答案<=某个值
如果公式不固定的话,那只能穷举了
非常感谢您的回复! 这个思路非常棒! 有两点不明白,请教您一下: 1.x+2 相当于 y+1 是如何得来的? 2.x+y 最小,是如何得来的?
想到以上这些的思路是什么? 觉得我自己在知识上有所欠缺,想不明白
期待回复,谢谢!
都是基于100x+200y-(x+y)这个公式,200y/100x=2y/x,所以y/x=2/1,至于x+y最小,是因为100x+200y<=1159,x+y<11,那100x+200y=1100,所以要最接近1159,肯定x+y要最小,得到的结果才是最接近的。 这种算法只能基于你这种特定条件下才有效的,不能通用的。。
学到了!非常感谢!
ax+by=c,这就是个斜线方程。xy如果是取float,根本就有无穷的解,只有当xy均为整数,且均大于0问题才成立。<br>
<p> func getXY(){<br /> <span></span> x := 0<br /> <span></span> a := 100<br /> <span></span> b := 200<br /> <span></span> c := 1159<br /> <span></span> m := 1.0<br /> <span></span> min := float64(c)<br /> <span></span> r := [2]int{}<br /> <span></span> var d,e float64<br /> <span></span> for m >= 0 {<br /> <span></span> m = float64(c - a x)/float64(b)<br /> <span></span> d = math.Abs(float64(ax+bint(m)-c))<br /> <span></span> e = math.Abs(float64(ax+bint(m+1)-c))<br /> <span></span> if d > e{<br /> <span></span> if e == 0{<br /> <span></span> fmt.Println("最小差值:",e)<br /> <span></span> fmt.Println("xy取值:",r)<br /> <span></span> return<br /> <span></span> }else if e < min{<br /> <span></span> min = e<br /> <span></span> r[0] = x<br /> <span></span> r[1] = int(m+1)<br /> <span></span> }<br /> <span></span> }else {<br /> <span></span> if d == 0{<br /> <span></span> r[0] = x<br /> <span></span> r[1] = int(m)<br /> <span></span> fmt.Println("最小差值:",d)<br /> <span></span> fmt.Println("xy取值:",r)<br /> <span></span> return<br /> <span></span> }else if d < min{<br /> <span></span> min = d<br /> <span></span> r[0] = x<br /> <span></span> r[1] = int(m)<br /> <span></span> }<br /> <span></span> }<br /> <span></span> x++<br /> <span></span> }<br /> <span></span> y := 0<br /> <span></span> for m >= 0 {<br /> <span></span> m = float64(c - b y)/float64(a)<br /> <span></span> d = math.Abs(float64(by+aint(m)-c))<br /> <span></span> e = math.Abs(float64(by+aint(m+1)-c))<br /> <span></span> if d > e{<br /> <span></span> if e == 0{<br /> <span></span> r[1] = y<br /> <span></span> r[0] = int(m+1)<br /> <span></span> fmt.Println("最小差值:",e)<br /> <span></span> fmt.Println("xy取值:",r)<br /> <span></span> return<br /> <span></span> }else if e < min{<br /> <span></span> min = e<br /> <span></span> r[1] = y<br /> <span></span> r[0] = int(m+1)<br /> <span></span> }<br /> <span></span> }else {<br /> <span></span> if d == 0{<br /> <span></span> r[1] = y<br /> <span></span> r[0] = int(m)<br /> <span></span> fmt.Println("最小差值:",d)<br /> <span></span> fmt.Println("xy取值:",r)<br /> <span></span> return<br /> <span></span> }else if d < min{<br /> <span></span> min = d<br /> <span></span> r[1] = y<br /> <span></span> r[0] = int(m)<br /> <span></span> }<br /> <span></span> }<br /> <span></span> y++<br /> <span></span> }<br /> <span></span> fmt.Println("最小差值:",m)<br /> <span></span> fmt.Println("xy取值:",r)<br /> } </p> <div> <br /> </div> <p> <br /> </p>
也可以,加continue 是放在if里面,然后if下面直接return,效果一样,写法可能会好看一点?
嗯,写 php 代码的时候,phpmd 会建议使用 continue,而不是使用 else
切线方程?