判断一个数能否通过一个数组中的数相乘而得到--类似完全背包问题,动态规划
1.题目描述: 判断一个数能否通过一个数组中的数相乘而得到(数组中的数使用次数不限) 例如:第一行输入目标数x,第二行再输入一个数组(每个数用空格隔开),如果能则输出1,不能则输出-1; 输入例1: 20 2 3 5 7 输出: 1 解释:20 = 2 2 5,可以组成,所以输出1. 输入例2: 20 3 5 7 输出: -1 解释:无法组成,所以输出-1. 解题思路 2.1错误想法 如20 数组为2,3,5,7 我们把每个数都除到不能整除,举例20/2/2=5 ,5/3不除, 5/5=1结束 while((cin >> tmp)){ if(x==1)break; while((float)x/(float)tmp - x/tmp ==0){//可以整出没有小数 x = x/tmp; } if(cin.get()=='\n'){ break; } } if(x==1){ cout <<1<<endl; }else{ cout <<-1<< endl; } 以上代码对于12 数组6 3 4 不成立,其原因是最终结果 3,4不包含6,而12却可以整除6. 按上面的流程是12/6 =2 ,2/3不整除,2/4不整除。 2.2转换为完全背包问题(使用动态规划解决) 原因分析:对于从 一堆数 中挑选重复若干数 乘积看是否得到某数 类似 在容量限制下,从一堆物品中重复挑若干物品组成价值最高