鱼C论坛

 找回密码
 立即注册
查看: 2390|回复: 2

题目116:考察方块的替换方法的数量

[复制链接]
发表于 2016-8-21 01:47:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 欧拉计划 于 2016-8-21 02:03 编辑
Red, green or blue tiles

A row of five black square tiles is to have a number of its tiles replaced with coloured oblong tiles chosen from red (length two), green (length three), or blue (length four).

If red tiles are chosen there are exactly seven ways this can be done.

QQ20160821-1@2x.png


If green tiles are chosen there are three ways.

QQ20160821-2@2x.png


And if blue tiles are chosen there are two ways.

QQ20160821-3@2x.png


Assuming that colours cannot be mixed there are 7 + 3 + 2 = 12 ways of replacing the black tiles in a row measuring five units in length.

How many different ways can the black tiles in a row measuring fifty units in length be replaced if colours cannot be mixed and at least one coloured tile must be used?

NOTE: This is related to Problem 117.


题目:

五块黑方形(长为 1)排成一行,我们要从几种长方形中选取,来替换掉五块中的若干块,其中,红色的长为 2,绿色的长为 3,蓝的是 4

如果选取红色的长方形,则正好有七种替换的方式,如下

QQ20160821-1@2x.png


如果选取绿色的长方形,则有三种

QQ20160821-2@2x.png

               
蓝色的话,就只有两种方法了

QQ20160821-3@2x.png
               
       
如果颜色不混搭的话,有 7 + 3 + 2 = 12 种方法来替换五块一行的黑方块。

请问,如果是五十块一行,那么,总共有多少种方式来替换?条件:颜色不混搭,至少使用一种颜色

注意:该题与题目117有关。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-5 13:03:28 | 显示全部楼层
from math import factorial as f
def solve116(n,r=2,g=3,b=4):
  return sum((f(n-i*c+i)//f(i)//f(n-i*c) for c in (r,g,b) for i in range(1,n//c+1)))
print solve116(50)
20492570929
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 13:05:40 | 显示全部楼层
//20492570929
#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
  long long f[2][51];
  int a[3] = { 2,3,4 };
  long long nSum = 0;
  for (int i = 0; i < 3; ++i)
  {
    memset(f, 0, sizeof(f));
    for (int j = 1; j <= a[i]; ++j)
      f[0][j] = 1;
    f[1][a[i]] = 1;
    for (int j = a[i] + 1; j <= 50; ++j)
    {
      f[1][j] = f[0][j - a[i]] + f[1][j - a[i]];
      f[0][j] = f[0][j - 1] + f[1][j - 1];
    }
    nSum += f[0][50] - 1 + f[1][50];
  }
  cout << nSum << endl;
  return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 21:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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