void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出要交换的卡片价值n,然后给出m个卡片,每个卡片的价值和数目,问你能有多少种来组成一个n

dfs往后搜索,dfs(left,index)从index往后搜,left是剩余的价值,if(left==0)种类++;

最蛋疼的是输出格式,让我纠结了一小会儿,PE了3次

#include <stdio.h>
#include <string.h>
struct cost{
    int v,cnt;
    
    }costs[20];
int val,n,num;

void dfs(int left,int index)
{
    if(left==0){num++ ;return ;}
    for(int i=index;i<n;i++)
    {
        if(costs[i].cnt>0&&left>=costs[i].v)
        {
            costs[i].cnt--;
            dfs(left-costs[i].v,i);
            costs[i].cnt++;
        }    
        
    }
    
}
int main()
{
    bool flag=true;
    while(scanf("%d%d",&val,&n)!=EOF)
    {
        
        num=0;
        for(int i=0;i<n;i++)
        scanf("%d%d",&costs[i].v,&costs[i].cnt);
        dfs(val,0);
        if(!flag)printf("\n");
        if(flag)flag=false;
        printf("%d\n",num);
    }
    
}
posted on 2011-05-14 12:11  void-man  阅读(558)  评论(0)    收藏  举报