【算法】1分2分5分的硬币,组成1角,共有多少种组合

1*x + 2*y + 5*z = 10

解法一:暴力枚举法

void main(){
  int n = 0;
  // 5分硬币最多有i个
  for (int i=0; i<3; i++)
  {
      // 2分硬币最多有10-5*ifor (int j=0; j<=(10-5*i)/2; j++)
      {
          // 1分硬币的个数
          for (int k=0; k<= 10 - 5*i - 2*j; k++)
          {
              if (10 == 5*i + 2*j +k)
              {
                  n++;
                  cout << "1分:"<<k<<"个  "<< "2分:"<<j<<"个  "<< "5分:"<<i<<"个 " << endl;
              }
          }
      }
   }
   cout << "所有组合有 = " <<n<<“ 种”<<endl;
}

解法二:背包问题

int main()
{
    int weight[] = {1,2,5};
    dp[0] = 1;
    for(int i=0; i<3; i++){
        for(int j=weight[i]; j<=10; j++){
            dp[j] += dp[j - weight[i]];
        }
    }
    cout << "dp=" <<dp[10]<< endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值