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);//递归核心 
   } 
}

  

posted @ 2012-04-08 18:34  开开甲  阅读(453)  评论(0编辑  收藏  举报