码迷,mamicode.com
首页 > 编程语言 > 详细

【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签

时间:2015-07-08 16:14:36      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

枚举法就好了,推理很麻烦,感觉也做不出来。

创造一个结构体,一个是真实的数,一个是花费的牙签数。

构建一位数,两位数,三位数即可。

#include <iostream>
#include <vector>
using namespace std;
//从0到9耗费的牙签数
int cost[10]={6,2,5,5,4,5,6,3,7,6};
struct num
{    
    int n;//用于计算的数
    int c;//耗费的牙签
};

num v[100000];
int main(int argc, char const *argv[])
{
    
    int v_size = 0;
    //一位数
    for (int i = 0; i <= 9; ++i)
    {
        num t;
        t.n = i;
        t.c = cost[i];
        v[t.n] = t;
    }
    //两位数
    for (int i = 1; i <=9; ++i)
    {
        for (int j = 0; j <= 9; ++j)
        {
            num t;
            t.n = i*10 + j;
            t.c = v[i].c + v[j].c;
            v[t.n] = t;
        }
    }
    //三位数
    for (int i = 1; i <=9; ++i)
    {
        for (int j = 0; j <= 9; ++j)
        {
            for(int k=0; k <= 9; ++k){
                num t;
                t.n = i*100 + j*10 + k;
                t.c = v[i].c + v[j].c + v[k].c;
                v[t.n] = t;
            }
        }
    }

    int total  = 0; //一共的答案数
    cin>>total;
    int ans =  0;
    //枚举A - B 计算C 和 cost
    for (int i = 999; i >=0; --i)
    {
        for (int j = 0; j <= i; ++j)
        {
            int k =  v[i].n - v[j].n;
            int cost = 3 + v[i].c + v[j].c + v[k].c;
            if(cost == total){
                //cout<<i<<"-"<<j<<"="<<k<<endl;
                ans++;
            }
        }
    }
    cout<<ans<<endl;

    return 0;
}

 

【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签

标签:

原文地址:http://www.cnblogs.com/yuchenlin/p/sjtu_oj_1381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!