1000元购物券 (分治递归)
题目:
公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
2 2
5 0
输入:
2
500
800
则应输出:
1
2 0
第一个商品买多少,还剩多少钱,对于第二个可以类似处理。简单的递归!2011年蓝点杯预赛题,当时不会做,惭愧。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int price[100],tmp[100];
int ans[100][100];
int s;//一共多少种
int tnum;
 
void fun(int a[],int sum,int n);
 
int main()
{
  int num,i,j;  
  scanf("%d",&num);
  tnum = num;    
    for(i = 0 ; i < num ; ++i)
      scanf("%d",&price[i]); 
     
    memset(ans,0,sizeof(ans));
  
    s = 0;      
    fun(price,1000,num);   
     
    printf("%d\n",s);
    for(i = 0 ; i < s ; ++i)
    {
          for(j = 0 ; j < num ; ++j)
            printf("%d ",ans[i][j]);
            printf("\n");
    }
      
  system("pause");    
  return 0;  
}
void fun(int a[],int sum,int n)//从后往前 
{
   int i,j,k;
   if(0 == n) //每个商品看完了 
   {
       if(0 == sum)//钱正好用完 
       {
          for(j = 0 ;j < tnum; ++j)
           ans[s][j] = tmp[j];      
          ++s;
       }
       return;    
   }
   k = sum/a[n-1];//最多能买几个第 n 个商品 
  
   for(i = k ; i >= 0 ; --i)
   {
         tmp[n-1] = i;
         fun(a,sum - i*price[n-1],n-1);//递归核心 
   } 
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号