主题:这道题该如何解(急等)
尘幻若梦
[专家分:0] 发布于 2010-10-24 10:17:00
题目的大概内容是这样的:
一个人跑步,规则是每天必须比前一天至少多跑一圈,假设总共跑200圈,问一共有多少种安排方法?写个程序实现,随便输入一个总圈数可得出安排方法总数,圈数为(3——500之间)。
回复列表 (共4个回复)
沙发
josephkwok [专家分:530] 发布于 2010-10-25 10:12:00
DP
板凳
好好 [专家分:880] 发布于 2010-10-28 01:21:00
#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 楼
overfly [专家分:3230] 发布于 2010-10-28 10:02:00
题目的意思是不是这样:不重复的正整数相加结果为N?
4 楼
justsoso8 [专家分:0] 发布于 2010-10-30 11:08:00
用的是递归的算法
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;
}
我来回复