动态规划经典入门题(初学必刷)

//题目难度与顺序无关
1.快饿死的xzzf
题目链接

题目描述
XzzF最近过着吃土的日子,饿的神魂颠倒!突然看到有人在做美食节宣传,有好多好吃的,但想吃到这些好吃的可以不容易!得答对主办方出的题。
现在XzzF拿到这样一道题:长度为N的01字符串,且满足以下条件的方案数有多少种?
1、串中不能有两个或多个连续的0。
例如,10、10101、11101是满足条件的,而00、10001、10010是不满足条件的。
XzzF已经饿的神志不清了!显然没有力气回答这道题了,所以,你一定要帮XzzF吃上那些好吃的,不然就莫得了!

输入描述:
一个整数N(1 <= N <= 20)。
输出描述:
满足题目所述条件的方案数。
代码:

#include<iostream>

using namespace std;
int dp[2][25];
int main()
{
    int n;
    cin>>n;
    dp[0][1]=1;
    dp[1][1]=1;
    for(int i=2;i<=n;i++)
    {
        dp[1][i]=dp[1][i-1]+dp[0][i-1];
        dp[0][i]=dp[1][i-1];
    }
    cout<<dp[0][n]+dp[1][n]<<endl;

}

2.AHOI2013 找硬币
题目链接

小蛇是金融部部长。最近她决定制造一系列新的货币。假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b > a)。
例如 1,5,125,250就是一组合法的硬币序列,而1,5,100,125就不是。不知从哪一天开始,可爱的蛇爱上了一种萌物——兔纸!从此,小蛇便走上了遇上兔纸娃娃就买的不归路。
某天,小蛇看到了N只可爱的兔纸,假设这N 只兔纸的价钱分别是a1,a2…aN。现在小蛇想知道,在哪一组合法的硬币序列下,买这N只兔纸所需要的硬币数最少。买兔纸时不能找零。
输入描述:
第一行,一个整数N,表示兔纸的个数
第二行,N个用空格隔开的整数,分别为N只兔纸的价钱
输出描述:
一行,一个整数,表示最少付的钱币数。

#include <iostream>
#include<math.h>
#include<string.h>
using namespace std;
 
int num[50], dp[100001], prime[100001], pri[10000];
 
int main()
{
    int n, ans, M = 0, result = 12345678, keyp = 0;
    cin >> n;
    dp[1] = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> num[i];
        dp[1] += num[i];
        if (M < num[i])M = num[i];
    }
    for (int i = 1; i <= M; i++)prime[i] = 1;
    for (int i = 2; i <= M; i++)if (prime[i])
    {
        pri[keyp++] = i;
        for (int j = i; j <= M; j += i)prime[j] = 0;
    }
    for (int i = 2; i <= M; i++)dp[i] = 12345678;
    for (int i = 1; i <= M; i++)
    {
        if (dp[i] < result)result = dp[i];
        for (int k = 0; k < keyp; k++)
        {
            int j = i*pri[k];
            if (j>M)break;
            ans = dp[i];
        for (int k = 0; k < n; k++)ans -= num[k] / i - num[k] / j - num[k] % j / i;
            if (dp[j]>ans)dp[j] = ans;
        }
    }
    cout << result << endl;
    return 0;
 
}

3.旅游
题目链接

Cwbc和XHRlyb生活在s市,这天他们打算一起出去旅游。
旅行地图上有n个城市,它们之间通过n-1条道路联通。
Cwbc和XHRlyb第一天会在s市住宿,并游览与它距离不超过1的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过1的所有城市。
他们不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。
XHRlyb想知道她与Cwbc最多能度过多少天的时光呢?
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
输入描述:
第一行,两个正整数n和s,表示城市个数和第一天住宿的城市s。
接下来n-1行,每行两个整数x和y,表示城市x与城市y之间有一条双向道路。
输出描述:
第一行,一个非负整数表示答案。

#include<iostream>
#include<cmath>
using namespace std;
const int N=500000+10;
int tail[N*2],tailss[N*2],pqx=1,head[N*2];
int dp[N][2];
void build(int sm,int la)
{tail[pqx]=sm;
 tailss[pqx]=head[la];
 head[la]=pqx;
 pqx++;
 
}
 
void bfs(int x,int f)
{dp[x][1]=1;
 for(int i=head[x];i;i=tailss[i])
 {if(tail[i]==f)
  continue;
  bfs(tail[i],x);
  dp[x][1]+=dp[tail[i]][0];
  dp[x][0]+=max(dp[tail[i]][0],dp[tail[i]][1]);
 }
 
}
int main()
{int n,s;
cin>>n>>s;
for(int i=1;i<=n-1;i++)
{int la,sm;
cin>>sm>>la;
build(sm,la);
build(la,sm);
}
bfs(s,-1);
cout<<dp[s][1]<<endl;
}

4.布置会场(1)
题目链接

今天是Tabris和mengxiang000来到幼儿园的第3天,mengxiang000接到了一个布置会场的任务。
他需要将贵宾观众席的椅子排成一排,一共需要N个。
幼儿园只有两种椅子,所以他也只能使用两种椅子。(A类型和B类型)并且假设每种椅子的数量都是无限的。
而其如果想要摆置一个B类型的椅子,对应就需要必须有连续两个一起布置。换句话说,就是如果出现了B类型的椅子,其必须且只有两个连着B类型的椅子。
mengxiang000突然想知道对应N个椅子排成一列,他能够有多少种布置的方式.
输入描述:
本题包含多组输入第一行输入一个整数t,表示测试数据的组数
每组测试数据包含一行,输入一个整数N,表示一共需要摆放的椅子数量
t<=30
1<=N<=30
输出描述:
每组测试数据输出包含一行,表示一共有多少种布置的方式。

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
 
int a[50];
int main()
{int t;
 cin>>t;
 int n;
 
 
 while(t--)
 {cin>>n;
  memset(a,0,sizeof(a));
     a[1]=1;
     a[2]=2;
  for(int i=3;i<=n;i++)
  {
      a[i]=a[i-1]+a[i-2];
           
 
  }
   cout<<a[n]<<endl;
 
 }
 
}

5.yb打炉石
题目链接

Wozuinb非常喜欢打炉石传说,但是菜的不行,所以他决定打
竞技场来练练手。系统按顺序给出n张卡牌,每张卡牌都有自
己的使用消耗a[i],每次只给出一张,wozuinb可以选择或者
弃掉这张牌。每选择一张牌都会按选择顺序放在卡槽中,当
卡槽中放满30张即可组成一套套牌。Wozuinb希望自己的套牌的
消耗满足一个平滑的曲线,即30张卡牌都满足第i张卡牌的消耗
不小于第i-1张(i>1)。请你帮助wozuinb看一看,这些卡牌能不
能组成想要的套牌,如果能组成输出“yes”,如果不能输出“no”。

输入描述:
第一行输入一个整数n,0<n<100。
第二行输入一行数字a[i],每个数字用空格隔开,代表第i张出现的卡牌的消耗。
输出描述:
输出一行,“yes”或“no”

#include<stdio.h>
using namespace std;
int main()
{
    int n;
    int a[1000];
    scanf("%d",&n);
        int i,flag=0;
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        if(n<30)
        printf("no\n");
        else
        {
           for(i=1;i<n;i++)
        {
            if(a[i]>=a[i-1])
            {
                flag=1;
                continue;
            } 
            else
                flag=0;
                break;
              
        }
        if(flag==1)
        printf("yes\n");
        else
        printf("no\n");
    }
    return 0;
}

6.HAOI2012 音量调节
题目链接

一个吉他手准备参加一场演出。他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量。在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改变的音量是多少。每一次改变音量,他可以选择调高也可以调低。
音量用一个整数描述。输入文件中给定整数beginLevel,代表吉他刚开始的音量,以及整数maxLevel,代表吉他的最大音量。音量不能小于0也不能大于maxLevel。输入文件中还给定了n个整数c1,c2,c3……cn,表示在第i首歌开始之前吉他手想要改变的音量是多少。
吉他手想以最大的音量演奏最后一首歌,你的任务是找到这个最大音量是多少。
输入描述:
第一行依次为三个整数:n, beginLevel, maxlevel。
第二行依次为n个整数:c1,c2,c3……cn。
输出描述:
输出演奏最后一首歌的最大音量。如果吉他手无法避免音量低于0或者高于maxLevel,输出-1。

#include<iostream>
#include<cmath>
 
using namespace std;
int dp[1001][1001];//因为音量可加可见,我没用想出优化掉一维的方法(初学,太菜)
int main()
{int n,begin,max;
cin>>n>>begin>>max;
int s;
dp[0][begin]=1;
for(int i=1;i<=n;i++)
    {cin>>s;
     for(int j=max;j>=0;j--)//从大到小和从小到大是一样的
     {if(dp[i-1][j]&&j+s<=max)//说明第i-1首曲子时能调到j的音量,切j+s<=max说明第i首曲子能调到j+s的音量
         dp[i][j+s]=1;
        if(dp[i-1][j]&&j-s>=0)//原理同上
            dp[i][j-s]=1;
     }
 
 
    }
    for(int i=max;i>=0;i--)//从大到小遍历,找最大
    {if(dp[n][i])//说明第n次可以调到i
        {cout<<i<<endl;
        return 0;
 
        }
    }
 
  cout<<-1<<endl;
  return 0;
}

7.货币系统
题目链接

在网友的国度中共有n种不同面额的货币,第i种货币的面额为a[i],你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为n、面额数组为a[1…n]的货币系统记作(n,a)。
在一个完善的货币系统中,每一个非负整数的金额x 都应该可以被表示出,即对每一个非负整数x,都存在n个非负整数t[i] 满足a[i] x t[i] 的和为x。然而,在网友的国度中,货币系统可能是不完善的,即可能存在金额x不能被该货币系统表示出。例如在货币系统n=3, a=[2,5,9]中,金额1,3就无法被表示出来。
两个货币系统(n,a)和(m,b)是等价的,当且仅当对于任意非负整数x,它要么均可以被两个货币系统表出,要么不能被其中任何一个表出。
现在网友们打算简化一下货币系统。他们希望找到一个货币系统(m,b),满足(m,b) 与原来的货币系统(n,a)等价,且m尽可能的小。他们希望你来协助完成这个艰巨的任务:找到最小的m。
输入描述:
输入的第一行包含一个整数T,表示数据组数。接下来按照如下格式分别给出T组数据。
每组数据的第一行包含一个正整数n。接下来一行包含n个由空格隔开的正整数a[i]。
输出描述:
输出文件共T行, 对于每组数据, 输出一行一个正整数, 表示所有与(n, a)等价的货币系统(m, b)中, 最小的m。

#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
vector<int>v;//开个vector 储存原有的面值
int t;
int dp[26000];
int z,n;
int dps()
{int ans=v.size();
 memset(dp,0,sizeof(dp));
 dp[0]=1;
 for(int i=0;i<v.size();i++)
 {if(dp[v[i]]==1)//说明这张钱能被表示
     ans--;
  else//因为不能被表示,我们就添加这个面值的钱
  for(int j=v[i];j<=v[n-1];j++)
    dp[j]=dp[j]||dp[j-v[i]];//如果dp[j]已经是1了,说明能表示,如果dp[j-v[i]]是一了说明可以用新增的货币v[i]和之前一个已经能表示的面额来表示j
 
 
 
 }
  return ans;
 
 
}
 
 
 
int main()
{cin>>t;
 while(t--)
 {
 cin>>n;
 v.clear();
 for(int i=1;i<=n;i++)
    {cin>>z;
     v.push_back(z);
 
    }
   sort(v.begin(),v.end());
   cout<<dps()<<endl;
 }
 
 
}

8.旅游
题目链接

Cwbc和XHRlyb生活在s市,这天他们打算一起出去旅游。
旅行地图上有n个城市,它们之间通过n-1条道路联通。
Cwbc和XHRlyb第一天会在s市住宿,并游览与它距离不超过1的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过1的所有城市。
他们不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。
XHRlyb想知道她与Cwbc最多能度过多少天的时光呢?
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
输入描述:
第一行,两个正整数n和s,表示城市个数和第一天住宿的城市s。
接下来n-1行,每行两个整数x和y,表示城市x与城市y之间有一条双向道路。
输出描述:
第一行,一个非负整数表示答案。

#include<iostream>
#include<cmath>
using namespace std;
const int N=500000+10;
int tail[N*2],tailss[N*2],pqx=1,head[N*2];
int dp[N][2];
void build(int sm,int la)
{tail[pqx]=sm;
 tailss[pqx]=head[la];
 head[la]=pqx;
 pqx++;
 
}
 
void bfs(int x,int f)
{dp[x][1]=1;
 for(int i=head[x];i;i=tailss[i])
 {if(tail[i]==f)
  continue;
  bfs(tail[i],x);
  dp[x][1]+=dp[tail[i]][0];
  dp[x][0]+=max(dp[tail[i]][0],dp[tail[i]][1]);
 }
 
}
int main()
{int n,s;
cin>>n>>s;
for(int i=1;i<=n-1;i++)
{int la,sm;
cin>>sm>>la;
build(sm,la);
build(la,sm);
}
bfs(s,-1);
cout<<dp[s][1]<<endl;
}

9.小明打联盟
题目链接

小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时间和固定的伤害值为:

1.乌鸦坐飞机 释放时间:x 固定伤害值:a

2.蜘蛛吃耳屎 释放时间:y 固定伤害值:b

3.饿狼前进 释放时间:z 固定伤害值:c

他还有一个大招,其释放的时间是一个区间【L,R】,可以在区间内任意时间点释放出技能,其如果在L+i时刻释放技能,其能够打出的伤害值为:temp+A*i

这里temp值表示技能的基础伤害(同时也就是在时刻L释放技能的伤害值),A是一个常数。

小明很喜欢研究连招使得在有限的时间内打出最高的伤害,现在他想要在T长度单位时间内打出最高的伤害,问这个最大伤害值。

输入描述:
本题包含多组数据。
输入格式为:
T
x a
y b
z c
L R temp A
数据范围:
1<=T<=1e5
1<=x,y,z,L,R<=T
L<=R
<=a,b,c,temp,A<=1e5
输出描述:
输出包含一行,输出能够打出的最高伤害值。

#include<iostream>
#include<math.h>
#include<string.h>
#include<string>
typedef long long ll;
using namespace std;
 
int main()
{ll time[100500];
    ll t;
 memset(time,0,sizeof(time));
ll a[6],b[6];
while(cin>>t)
{ll e,r,z;
 memset(time,0,sizeof(time));
for(ll i=1;i<=3;i++)
        cin>>a[i]>>b[i];
cin>>a[4]>>e>>r>>z;
 b[4]=r;
 a[5]=e;
 b[5]=r+(e-a[4])*z;
for(ll i=1;i<=5;i++)
    {for(ll j=a[i];j<=t;j++)
       {
           time[j]=max(time[j],time[j-a[i]]+b[i]);
 
            
           
  
      
 
 
       }
    }
for(int i=0;i<=e-a[4];i++)
    time[t]=max(time[t],time[t-a[4]-i]+r+i*z);
    
 
cout<<time[t]<<endl;
}
 
}

10.xinjun与阴阳师
题目链接

xinjun是各类手游的狂热粉丝,因随手一氪、一氪上千而威震工大,现在他迷上了阴阳师。xinjun玩手游有一个习惯,就是经过层层计算制定出一套方案来使操作利益最大化(因此即使有扫荡券也不用,故称圣雄肝帝)。已知阴阳师有N个模式可以操作,模式i有ai种操作,但每种模式每日只能选用一种操作,可以不选。操作j能收益vj,但需要花费体力wj点。xinjun每日拥有体力M点,求他每日最多能得到多少收益。

输入描述:
第一行一个正整数T(T<=10),表示共有T组数据。

对于每组数据,第一行两个正整数N,M(1<=N,M<=1000)。

接下来N段数据,每段第一行一个正整数ai(1<=ai<=1000),第二行ai个正整数vj(1<=vj<=1000),第三行ai个正整数wj(1<=wj<=1000)。

每组数据ai之和不大于104。

输出描述:
对每组数据输出一行,即xinjun每日最多能得到多少收益。

#include<iostream>
#include<math.h>
#include<string.h>
#include<stdio.h>
using namespace std;
struct qq
{int num,b[1010],c[1010];
 
}a[1010];
int dp[1010];
int main()
{int n,m;
int t;
cin>>t;
while(t--)
    {memset(dp,0,sizeof(dp));
        cin>>n>>m;
     memset(a,0,sizeof(a));
   for(int i=1;i<=n;i++){
            scanf("%d",&a[i].num);
            for(int j=1;j<=a[i].num;j++){
                scanf("%d",&a[i].b[j]);
            }
            for(int j=1;j<=a[i].num;j++){
                scanf("%d",&a[i].c[j]);
            }
        }
 
     for(int i=1;i<=n;i++){
         for(int j=m;j>=0;j--){
            for(int k=1;k<=a[i].num;k++)
                {  if(j>=a[i].c[k])
                   dp[j]=max(dp[j],dp[j-a[i].c[k]]+a[i].b[k]);
                }
         }
     } 
     cout<<dp[m]<<endl;
 
    }
 
}

11.hdu2602 Bone Collector
题目链接
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?

Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the maximum of the total value (this number will be less than 2 31).

#include<stdio.h>
#include<iostream>
using namespace std;
int dp[1000][1001];
int mix(int a,int b)
{if(a>b)
  return a;
  else
    return b;

}



int main()
{
    int q;
    int n,v,va[1000],vo[1000];
   cin>>q;
    while(q)
    {cin>>n>>v;
    for(int i=1;i<=n;i++)
        scanf("%d",&va[i]);

        for(int i=1;i<=n;i++)
            scanf("%d",&vo[i]);

            for(int i=0;i<=v;i++)
            {for(int p=1;p<=n;p++)
             {




            if(vo[p]<=i)

            dp[i][p]=mix(dp[i][p-1],dp[i-vo[p]][p-1]+va[p]);//p=货 i=体积
            else
                dp[i][p]=dp[i][p-1];

            }}
    printf("%d\n",dp[v][n]);
    q--;}
return 0;}

12.hdu1171 Big Event in HDU
题目链接

Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don’t know that Computer College had ever been split into Computer College and Software College in 2002.
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds).
Input
Input contains multiple test cases. Each test case starts with a number N (0 < N <= 50 – the total number of different facilities). The next N lines contain an integer V (0<V<=50 --value of facility) and an integer M (0<M<=100 --corresponding number of the facilities) each. You can assume that all V are different.
A test case starting with a negative integer terminates input and this test case is not to be processed.
Output
For each case, print one line containing two integers A and B which denote the value of Computer College and Software College will get respectively. A and B should be as equal as possible. At the same time, you should guarantee that A is not less than B.

#include<iostream>
#include<math.h>
#include<string>
#include<stdio.h>
#include<string.h>
using namespace std;
int poww(int t, int v) {
    int ans = 1, base = t;
    while (v != 0) {
        if (v & 1 != 0)
{
            ans *= base;
}
            base *= base;
            v >>= 1;
    }
    return ans;
}
int a[70000],b[1000];
int all;
int main()
{int n;
while(cin>>n)
    {if(n<=0)
     continue;
     all=0;
     for(int i=1;i<=n;i++)
     {cin>>a[i]>>b[i];

     all+=a[i]*b[i];
     }
     int q=n+1;
     for(int i=1;i<=n;i++)
     {if(b[i]==1)
     continue;
     else
        {for(int j=0;j<=10;j++)
           {if(b[i]-poww(2,j)>=0)
                    {a[q]=poww(2,j)*a[i];
                        q++;
                        b[i]-=poww(2,j);
                    }
           else
                    {a[q]=b[i]*a[i];
                    q++;
                    a[i]=0;

                    }
           }


        }


     }

  int       half=all/2;
       int f[500000];
       memset(f,0,sizeof(f));
       for(int i=1;i<=q-1;i++)
        {for(int j=half;j>=a[i];j--)
          f[j]=max(f[j],f[j-a[i]]+a[i]);

        }
if(f[half]>=all-f[half])
    cout<<f[half]<<" "<<all-f[half]<<endl;
    else
        cout<<all-f[half]<<" "<<f[half]<<endl;
    }

}

13.方块与收纳盒
题目链接

现在有一个大小n1的收纳盒,我们手里有无数个大小为11和2*1的小方块,我们需要用这些方块填满收纳盒,请问我们有多少种不同的方法填满这个收纳盒

输入描述:
第一行是样例数T
第2到2+T-1行每行有一个整数n(n<=80),描述每个样例中的n。
输出描述:
对于每个样例输出对应的方法数

#include <iostream>
#include<string.h>
using namespace std;
long long dp[85];
int main()
{int t;
 cin>>t;
 int n;
 while(t--)
 {memset(dp,0,sizeof(dp));
  cin>>n;
  dp[1]=1;
  dp[2]=2;
  for(int i=3;i<=n;i++)
    {
      dp[i]=dp[i-1]+dp[i-2];
    }
    cout<<dp[n]<<endl;

 }


}

14.旅行的青蛙
题目链接

一只青蛙出去旅游,因为中国有一句古话说的好:“由简入奢易,由奢入俭难”,所以这只青蛙当看的当前景点比前面看过的景点差的时候,青蛙就会说“不开心”为了避免这只青蛙说“不开心”,并且使青蛙看的景点尽量的多,所以他请你帮忙给他安排一条线路,使青蛙可以看到尽量多的景点,并且不走回头路。
输入描述:
第一行为一个整数n,表示景点的数量
接下来n行,每行1个整数,分别表示第i个景点的质量
输出描述:
一个整数,表示青蛙最多可以看到几个景点

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
long long dp[300005];
long long sum[300005];
long long n,m,t;
int main()
{
    scanf("%lld",&n);
    long long i,j;
    long long maxx=-1;
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&sum[i]);
        dp[i]=1;
        for(j=1;j<i;j++)
        {
            if(sum[i]>=sum[j])
            {
                dp[i]=max(dp[i],dp[j]+1);
            }
        }
        maxx=max(maxx,dp[i]);
    }
    printf("%lld",maxx);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值