本关任务:公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为:n1,n2,…;要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表着m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示每种商品购买的数量,中间用空格分隔。
相关知识
为了完成本关任务,你需要掌握:1.如何分治递归
编程要求
根据提示,在右侧编辑器补充代码
测试说明
平台会对你编写的代码进行测试:
测试输入:
2 200
300
预期输出:
2 2 2
5 0
测试输入:
2 500
800
预期输出:
1 2 0
提示:
public void dfs(int sum, int step) {
if(step == m) { //如果已达到最后一个商品
if(sum == 1000) { //如果钱正好花完
}
return;
} else {
}
}
import java.util.ArrayList; import java.util.Scanner; public class Main { public static ArrayList<Integer> list = new ArrayList<Integer>(); // 创建一个ArrayList对象 public static int[][] value; public static int m; public static int count = 0; public static String result = ""; public void dfs(int sum, int step) { if(step == m){//如果已到达最后一个商品 if(sum==1000) {//如果钱正好花完 for (int i = 0; i < list.size(); i++) { result += list.get(i) + ""; } result += "\n"; count++; } return; } else{ for(int i=0;i<=value[step][1];i++){ sum+=value[step][0]*i; list.add(i); dfs(sum,step+1); sum-=value[step][0]*i; list.remove(list.size()-1); } } } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); m = in.nextInt(); value = new int[m][2]; for(int i = 0;i < m;i++) { int a = in.nextInt(); int num=1000/a; value[i][0]=a; value[i][1]=num; } test.dfs(0, 0); if(count == 0) System.out.println("0"); else System.out.println(count+"\n"+result); } }