• luoguP1118 [USACO06FEB]数字三角形`Backward Digit Su`… 题解


    一上午都在做有关搜索的题目,,,

    看到这题之后就直接开始爆搜

    结果只有70分,

    其余的点硬生生的就是那么WA了。

    我的天哪~

    70分代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 int n,sum;
     6 int ans;
     7 bool dis[12];
     8 int f[13][13];
     9 void shuchu() {
    10     for(int i=1; i<=n; i++)
    11         cout<<f[1][i]<<" ";
    12 }
    13 void check() {
    14     for(int i=2; i<=n; i++)
    15         for(int j=1; j<=n-i+1; j++)
    16             f[i][j]=f[i-1][j]+f[i-1][j+1];
    17         /*    for(int i=1;i<=n;i++){
    18                 for(int j=1;j<=n-i+1;j++)
    19                 cout<<f[i][j]<<" ";
    20                 cout<<'
    ';
    21             }*/
    22 //            cout<<f[n][1]<<" ";
    23     if(f[n][1]==sum) {
    24         shuchu();
    25         ans++;
    26     }
    27 }
    28 void pai(int k) {
    29     if(k>n&&!ans) {
    30         check();
    31         return;
    32     }
    33     for(int i=1; i<=n; i++) {
    34         if(!dis[i]) {
    35             dis[i]=true;
    36             f[1][k]=i;
    37             pai(k+1);
    38             dis[i]=false;
    39         }
    40     }
    41 }
    42 inline int read() {
    43     int s=0,w=1;
    44     char ch=getchar();
    45     while(ch<'0'||ch>'9') {
    46         if(ch=='-')w=-1;
    47         ch=getchar();
    48     }
    49     while(ch>='0'&&ch<='9')
    50         s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
    51     return s*w;
    52 }
    53 int main() {
    54     n=read(),sum=read();
    55     pai(1);
    56     return 0;
    57 }

    之后就开始手动模拟 check() 的过程

    猛然发现

    这貌似是个杨辉三角,哟哟哟。,,

    满分代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 int n,sum;
     6 int ha[13],flag,yh[13][13];
     7 bool v[13];
     8 void print(){
     9     for(int i=1;i<=n;i++)
    10         printf("%d ",ha[i]);
    11 }
    12 //那个函数被我删了
    13 void dfs(int step,int ans){
    14     if(ans>sum||flag)return;
    15     if(step==n+1&&ans==sum){
    16         print();
    17         flag=1;//标记
    18         return;
    19     }
    20     for(int i=1;i<=n;i++)
    21         if(!v[i]){
    22             ha[step]=i;
    23             v[i]=true;
    24             dfs(step+1,ans+i*yh[n][step]);//看顶楼的解释
    25             v[i]=false;//回溯
    26         }
    27 }
    28 
    29 int main(){
    30     scanf("%d%d",&n,&sum);
    31     yh[1][1]=1;
    32     for(int i=2;i<=n;i++)//构造杨辉三角
    33         for(int j=1;j<=i;j++)
    34             yh[i][j]=yh[i-1][j-1]+yh[i-1][j];
    35     dfs(1,0);
    36     return 0;
    37 }
  • 相关阅读:
    ASCII&Base64
    CentOS自动同步时间
    Java的HashMap
    Java线程同步操作
    Nginx基本配置与应用
    vc中调用Com组件的方法详解
    VC++ try catch (转)
    oracle中exp,imp的使用详解
    jdbc oracle 连接字符串
    标准的开源实现
  • 原文地址:https://www.cnblogs.com/ydclyq/p/11668386.html
Copyright © 2020-2023  润新知