【动态规划】求组合数问题
又是苦瓜一样的算法作业,遇到组合数问题的时候想这问题怎么用动态规划算法,上网查了一下,找到了这个公式。
一开始的想法是用一个双层for循环,直接从i=m和j=n往1开始for循环,但是,这样的话,一开始数组全为0,到头来整个数组还是没变化。
于是就有了下面的代码:
#include<iostream>
using namespace std;
int dynamic(int m,int n){
int a[m+1][n+1];
for(int i=1;i<=m;i++){ //因为下面的双层for循环需要用到j-1,所以下面的for循环不能从j=0开始,所以在这个地方先给特殊的地方赋值
for(int j=0;j<=n;j++){
if(j==0 || i==j){
a[i][j]=1;
}
}
}
for(int i=2;i<=m;i++){
for(int j=1;j<=n;j++){ //有些地方赋值重复了,我懒得改,对不起
if(j==0 || i==j){
a[i][j]=1;
}
else if(j>i){ //特殊情况,当n>m
a[i][j]=0;
}
else{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
return a[m][n];
}
int main(){
while(true){
int m,n;
cout<<"请输入组合数的m和n(m>n):"<<endl;
cin>>m>>n;
int p;
p=dynamic(m,n);
cout<<"结果为:";
cout<<p<<endl;;
}
}
我也不知道是不是特别对劲