1312: 购物券消费方案
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 30 Solved: 7
[ Submit][ Status][ Web Board]
Description
公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
Input
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价(0<m<1000)。
Output
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
Sample Input
2
200
300
Sample Output
2
2 2
5 0
HINT
import java.util.Scanner;
public class Main1{
static Scanner in = new Scanner(System.in);
static int n,max,count=0,count1=0;
static int a[]=new int[1000];
static int c[]=new int[1000];
public static void main(String[] args) {
n=in.nextInt();
max=1000;
for(int i=0;i<n;i++){
a[i]=in.nextInt();
if(max>=a[i])max=a[i];
}
dfs1(0,0);
System.out.println(count);
count=0;
dfs(0,0,c);
}
private static void dfs(int step, int t, int[] c2) {
// TODO Auto-generated method stub
if(step>=n){
if(t==1000){
count1++;
for(int i=0;i<n;i++){
System.out.printf("%d ",c2[i]);
}
System.out.println();
}
return;
}
for(int i=0;i<=1000/max;i++){
c2[step]=i;
t=t+a[step]*i;
step++;
dfs(step,t, c2);
step--;t=t-a[step]*i;
}
}
private static void dfs1(int step,int t) {
// TODO Auto-generated method stub
if(step>=n){
if(t==1000){
count++;
}
return;
}
for(int i=0;i<=1000/max;i++){
t=t+a[step]*i;
step++;
dfs1(step,t);
step--;t=t-a[step]*i;
}
}
}