回 帖 发 新 帖 刷新版面

主题:这道题该如何解(急等)

题目的大概内容是这样的:
    一个人跑步,规则是每天必须比前一天至少多跑一圈,假设总共跑200圈,问一共有多少种安排方法?写个程序实现,随便输入一个总圈数可得出安排方法总数,圈数为(3——500之间)。

回复列表 (共4个回复)

沙发

DP

板凳

#include <stdio.h>
#include <conio.h>

int plan[100];
int round;

void f_plan(int n);
int add_plan(int n);
void display(int n);
int main()
{
  printf("please enter round:\n");
  scanf("%d",&round);
  f_plan(0);
  getch();
  return 0;
}

int add_plan(int n)
{
  int i,sum=0;
  for(i=0;i<=n;i++)  sum+=plan[i];
  return sum;
}

void display(int n)
{
  static unsigned long int i=1;
  int k;
  printf("plan %d :",i);
  i++;
  for(k=0;k<=n;k++)
  printf("%d ",plan[k]);
  printf("\n");
}
void f_plan(int n)
{
  int i;
  for(i=1;;i++)
    {
      if(n==0&&i<=round) {plan[n]=i;f_plan(n+1);}
      else
      {
        plan[n]=plan[n-1]+i;
    if(add_plan(n)>round) return;
    if(add_plan(n)<round) f_plan(n+1);
      }
    if(add_plan(n)==round) display(n);
    }
}
总方案数及每种方案安排方法都可以显示出来,
输入圈数时,建议先不要太大,在15圈以内,便于检验,200圈时结果是非常大的,时间也要很长
你先运行看一下,如需注释请说一声

3 楼

题目的意思是不是这样:不重复的正整数相加结果为N?

4 楼

用的是递归的算法


int solution=0;

void subroutine(int n1, int n2)
{
    int n21, n22, maxn21;;

    n21=n1+1;
    maxn21=n2>>1;
    while (n21<=maxn21)
    {
        n22=n2-n21;
        if (n22>n21)
        {
            solution+=1;
            cout<<"solution "<<solution<<": ";
            cout<<n2<<"="<<n21<<"+"<<n22<<endl;
            subroutine(n21,n22);
        }
        n21++;
    }
}

int main(int argc, char* argv[])
{
    int round;
    cout<<"Please enter round: ";
    cin>>round;
    subroutine(0,round);
    cout<<"***"<<solution<<"***"<<endl;;
    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册