华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3823|回复: 10
打印 上一主题 下一主题

100分成6个数字的和的方案

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
#
发表于 2014-10-25 18:05:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  1. //100分成6个数字的和
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <iomanip>
  5. using namespace std;
  6. const int maxm=20;  //100太大了 20 来验证
  7. const int maxn=7;//0位作废
  8. int ss;
  9. int a[maxn];
  10. int d[maxm+1][maxn];
  11. int z[7]={0,maxm/6,maxm/5,maxm/4,maxm/3,maxm/2,maxm};  //每个数字的最大值  显然第一个数字不可能超过100/6
  12. void mysearch(int i)  //递归的做法
  13. {

  14.     int j,k,s;
  15.     if (i>=maxn-1)
  16.     {
  17.         s=a[1]+a[2]+a[3]+a[4]+a[5];
  18.         a[6]=maxm-s;  //计算出A[6]而不是枚举出a[6],减少一次递归,
  19.         if (a[6]>=a[5])
  20.         {cout<<setw(5)<<++ss<<':';for (j=1; j<=maxn-1; j++) cout<<a[j]<<' ';
  21.         cout<<endl;}
  22.     }
  23.     else for (k=a[i-1]; k<=z[i]; k++)   {a[i]=k;mysearch(i+1);}

  24. }
  25. void pp()
  26. {
  27.     int i,j;
  28.     cout<<"=====================\n";
  29.     for (j=0;j<=6;j++)
  30.     {for (i=0;i<=21;i++) cout<<setw(4)<<d[i][j];cout<<endl;}
  31. }
  32. int dp(int m,int n) //动态规划的做法
  33. {   int i,j,k;
  34.     for(i=1;i<=maxm;i++) {d[i][1]=1; //任何数字分成1个数字有一种做法;
  35.     d[i][2]=i/2;}//任何数字分成2个数字有i/2种做法;
  36.     for(i=2;i<=maxm;i++)
  37.         for(j=2;j<=maxn-1;j++)
  38.            if (i>=j) d[i][j]=d[i-1][j-1]+d[i-j][j];  //这个公式要认真思考!!!
  39.     /*把100分成6份等价于两种分法的和
  40.     1、99分成5份,最后加一份1
  41.     2、95分成6份,每份加上1
  42.     这两种分法之间没有重复,并且加起来覆盖了全部  */

  43.     return d[m][n];
  44. }
  45. int main()
  46. {
  47.     //freopen("1.txt","w",stdout);
  48.     a[0]=1;mysearch(1);
  49.     cout<<dp(maxm,6);
  50.     pp();
  51. }

复制代码


回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
10#
 楼主| 发表于 2020-3-5 09:02:24 | 只看该作者
张溯源 发表于 2020-3-4 21:16
为啥我一直没有结果

因为你好几个地方b[k]=0 和 b[k]=1 写错了!请看36行  44行。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

61

积分

注册会员

Rank: 2

积分
61
9#
发表于 2020-3-4 21:16:52 | 只看该作者
为啥我一直没有结果
回复 支持 反对

使用道具 举报

0

主题

11

帖子

61

积分

注册会员

Rank: 2

积分
61
8#
发表于 2020-3-4 21:14:24 | 只看该作者
本帖最后由 张溯源 于 2020-3-4 21:15 编辑
  1. #include<iostream>
  2. using namespace std;
  3. int a[7];
  4. bool b[110];
  5. int sum;
  6. void ish()
  7. {
  8.         sum=0;
  9.         for(int i=1;i<=6;i++)
  10.                 sum=sum+a[i];
  11. }
  12. void pr()
  13. {
  14.         for(int i=1;i<=5;i++)
  15.                 cout<<a[i]<<"+";
  16.         cout<<a[6]<<"=100";
  17.         cout<<endl;
  18. }
  19. void pmn(int i)
  20. {
  21.         if(i>6)
  22.         {
  23.                 ish();
  24.                 if(sum==100)
  25.                         pr();
  26.         }
  27.         else
  28.         {
  29.                 for(int k=1;k<=100;k++)
  30.                 {
  31.                         if(b[k]==1)
  32.                         {
  33.                                 a[i]=k;
  34.                                 b[k]=0;
  35.                                 pmn(i+1);
  36.                                 b[k]=0;
  37.                         }
  38.                 }
  39.         }
  40. }
  41. int main()
  42. {
  43.         for(int i=0;i<110;i++)
  44.                 b[i]=0;
  45.         pmn(1);
  46.         return 0;
  47. }
复制代码


(简单的)dfs,请大佬们过目(满足o(* ̄︶ ̄*)o)
只不过为什么一直没有结果……
~~~知识新手,别鄙视我~~~
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
7#
发表于 2018-9-1 13:49:21 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int i,j;
  4. int s[101][7];
  5. int main()
  6. {
  7.     for(i=1;i<=100;i++)
  8.         s[i][1]=1;
  9.     for(i=2;i<=6;i++) s[1][i]=0;
  10.     for(i=2;i<=100;i++)
  11.         for(j=2;j<=6;j++)
  12.             s[i][j]=i-j>=0?s[i-1][j-1]+s[i-j][j]:s[i-1][j-1];
  13.     cout<<s[100][6];
  14.     return 0;
  15. }
复制代码
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
6#
发表于 2018-9-1 13:47:02 | 只看该作者
本帖最后由 universehyf 于 2018-9-1 13:48 编辑
  1. <blockquote>#include<iostream>
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
5#
发表于 2018-6-26 16:39:14 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int i,j,m,n;
  4. int main()
  5. {
  6.     cin>>m>>n;
  7.     int a[m][n];
  8.     for(i=0;i<=m;i++)
  9.         for(j=0;j<=n;j++)
  10.             a[i][j]=0;
  11.     for(i=0;i<=m;i++)a[i][1]=1;
  12.     for(i=1;i<=m;i++)
  13.         for(j=2;j<=n;j++)
  14.     {
  15.         a[i][j]=a[i-1][j-1]+a[i-j][j];
  16.         if(j>i)a[i][j]=0;
  17.     }
  18.     cout<<a[m][n];
  19.     return 0;
  20. }
复制代码

回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
地板
发表于 2018-6-26 11:12:07 | 只看该作者
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. long long f[1000][10]={0};
  14. int main()
  15. {
  16.         f[1][1]=f[2][1]=f[2][2]=1;
  17.     for(int i=2;i<=101;i++)
  18.     {
  19.             f[i][1]=1;
  20.             for(int j=2;j<=6&&i>=j;j++)
  21.                     f[i][j]=f[i-1][j-1]+f[i-j][j];
  22.     }
  23.     printf("%d",f[100][6]);
  24.     return 0;
  25. }
复制代码
回复 支持 反对

使用道具 举报

4

主题

68

帖子

1592

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1592
板凳
发表于 2014-10-29 21:01:46 | 只看该作者
/wjr/ 发表于 2014-10-29 14:39
.......自动忽视。。。用Dev-cpp4.9.9.2写的

我本来也想用dev-c++的,可惜win8.1已经完美不兼容了……所以一直没用过。
这个人很懒,不想写签名。
回复 支持 反对

使用道具 举报

2

主题

17

帖子

143

积分

注册会员

Rank: 2

积分
143
QQ
沙发
发表于 2014-10-29 14:39:16 | 只看该作者
hr567 发表于 2014-10-28 21:49
……
不需要吧?

.......自动忽视。。。用Dev-cpp4.9.9.2写的
回复 支持 反对

使用道具 举报

2

主题

17

帖子

143

积分

注册会员

Rank: 2

积分
143
QQ
楼主
发表于 2014-10-28 18:41:50 | 只看该作者
  1. #include<iostream>
  2. #include<cstdlib>
  3. using namespace std;
  4. int n,m,a[100000],tot;
  5. void print()
  6. {
  7.         int k;tot++;
  8.         for(k=1;k<=m-1;k++)cout<<a[k]<<"+";
  9.         cout<<a[m]<<endl;
  10. }
  11. void mysearch(int i,int n)
  12. {
  13.         for(int j=a[i-1];j<=n;j++)
  14.         if(j)
  15.         {
  16.                 n-=j;a[i]=j;
  17.                 if(i==m&&n==0)print();
  18.                 else if(i!=m)mysearch(i+1,n);
  19.                 n+=j;
  20.         }
  21. }
  22. int main()
  23. {
  24.         cin>>n>>m;
  25.         mysearch(1,n);
  26.         cout<<tot;
  27.         system("pause");return 0;
  28. }
复制代码

输入10,3即可。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-1 20:25 , Processed in 0.117112 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表