leetcode:1155. 掷骰子的N种方法(中等)

问题:

在这里插入图片描述

分析:

依然是背包问题的变形。
如每个色子不同,可以直接:
A【i】【j】标识第i个及其之后的筛子 和为i的总数和。
但是筛子相同,可以考虑增加1维,表示只能放其之后的数字。那不如用搜索。

(1,2)和(2,1)不同:

#include<bits/stdc++.h> 
using namespace std;
int A[1001][1001];
int ff(int d, int f, int target)
{
 cout<<target<<" "<<d<<endl;
 if(A[target][d]!=-1) return A[target][d];
 if(d>target) 
 {
  return 0;
 }
 if(d==0&&target==0) return 1; 
 if(d==0&&target!=0) return 0;
  A[target][d]=0;
 for(int i=1;i<=f;i++)
 {
  if(target-i>=0)
  A[target][d]=(A[target][d]+ff(d-1,f,target-i))%(int)(pow(10,9)+7);
  else break;
 }
 return A[target][d];
}
int main()
{
 int d=2;
 int f=5;
 int target=10;
 
 for(int i=0;i<1001;i++)
 for(int ii=0;ii<1001;ii++)
 A[i][ii]=-1;
 cout<<ff(d,f,target);
}

(1,2)和(2,1)相同:

int A[1001][1001][31];
int all=0;
void f1(int d, int f, int target)
{//f代表可以放小于等于几的数 
 if(target==0&&d==0)
    {
        all++;
        return ;
    }
 if(target<d) return;
 if(f==1)
 {
  if(d==target) all++;
  return;
 }
 //f(d,f-1,target);//放0个的情况 
 for(int i=0;;i++)
 {
  if(target-i*f>=0)
  f1(d-i,f-1,target-i*f);
        else break;
 }
}
int main()
{
 int d;//个数 
 int f;//面数 
 int target;//目标数 
 f(d,f,target);
 return all;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值