uva 10943 How do you add?
2013-02-17 22:13
435 查看
递推
题意:给出n和k,用k个数字(可以相同)使他们的和为n,问有多少种方案数,其中好像a+b,b+a这种算为两种方案,也就是考虑排列
这个问题用递推来做,按位递推。dp[c][s]表示在利用c个数字的条件下相加得s的方案数
dp[c][s]=dp[c-1][s]+dp[c-1][s-1]+dp[c-1][s-2]……dp[c-1][0]
另外需要初始化
无论多少位,相加和位0的话方案数是1,即全部为0,所以dp[c][0]=1
另外当只有一个数字时要相加和为s,方案数也是1,即只能填s本身,dp[1][s]=1
然后就可以开始递推了
我是用记忆化搜索来写的
题意:给出n和k,用k个数字(可以相同)使他们的和为n,问有多少种方案数,其中好像a+b,b+a这种算为两种方案,也就是考虑排列
这个问题用递推来做,按位递推。dp[c][s]表示在利用c个数字的条件下相加得s的方案数
dp[c][s]=dp[c-1][s]+dp[c-1][s-1]+dp[c-1][s-2]……dp[c-1][0]
另外需要初始化
无论多少位,相加和位0的话方案数是1,即全部为0,所以dp[c][0]=1
另外当只有一个数字时要相加和为s,方案数也是1,即只能填s本身,dp[1][s]=1
然后就可以开始递推了
我是用记忆化搜索来写的
#include <cstdio> #include <cstring> #define MOD 1000000 #define N 110 long long dp ; int n,m; void dfs(int c , int s) //dp[c][s]在c位内构建出s { if(dp[c][s]!=-1) return ; dp[c][s]=0; for(int i=0; i<=s; i++) //当前位能填的数字 { dfs(c-1,s-i); //在剩下的c-1位中要构建出s-i dp[c][s]=(dp[c][s]+dp[c-1][s-i])%MOD; } return ; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(!n && !m) break; memset(dp,-1,sizeof(dp)); for(int i=1; i<=m; i++) dp[i][0]=1; //要构建出0的方案数必定为1 for(int i=0; i<=n; i++) dp[1][i]=1; //当只有1位时构建的方案数也是1,唯一的 dfs(m,n); printf("%lld\n",dp[m] ); } return 0; }
相关文章推荐
- UVA 10943 - How do you add?
- UVA 10943 - How do you add?
- UVA 10943 How do you add?
- UVA 10943 How do you add?
- UVa 10943 How do you add?(数学递推)
- UVA 10943 - How do you add?
- UVA 10943 How do you add?——背包
- (UVA - 10943)How do you add? (组合数学,隔板)
- UVa 10943 - How do you add?
- UVa:10943 How do you add?
- uva 10943 - How do you add?(dp)
- UVa 10943 How do you add?【递推】
- How do you add?(UVA 10943)
- UVA 10943 How do you add?
- UVA 10943 - How do you add? 递推
- uva 10943 How do you add?
- uva10943 How do you add?(隔板法+递推)
- UVA 10943(How do you add?)
- UVA - 10943 How do you add?【组合数取余(递推)】
- UVA 10943 - How do you add? 递推