相加之和为某个数n,求方法数 ------------ 动态规划的方法

uva11137 n3可转化为n2(立方和为n的方法数)

/*
ID: neverchanje
PROG:
LANG: C++11
*/
#include<iostream>
#include<cstring>
#include<cstdio>
typedef long long ll;
using namespace std;

int n;
long long d[23][maxn]; //下标<=21
int main(){
memset(d,0,sizeof(d));
d[0][0]=1;
for(int i=1;i<22;i++)
for(int j=0;j<=10000;j++){//注意j不能超过10001,否则会出错(不知道怎么回事)
if(j-i*i*i>=0) d[i][j] += d[i][j-i*i*i];
d[i][j] += d[i-1][j];
}
while(cin>>n)
printf("%lld\n",d[21][n]);
return 0;
}
/*
DESCRIPTION:
d(i,j)为下标不超过i的立方和为j的方法数
d(i,j) = sum( d(i-1,j-k*i^3) )
答案是d(21,n)

注意:
由于j要从0开始,所以转移方程要有所改变
d(i,j+k*i^3) = sum( d(i-1,j) )
*/

poj2140 (计算和为n的方法数) 其实这道题有更好的方法

/*
ID: neverchanje
PROG:
LANG: C++11
*/

#include<iostream>
using namespace std;

int res=1,N;

void dp(int a,int i){ //a<i的情况可排除
if(a==i) res++;
else if(a>i)
dp(a-i,i+1);
}

int main(){
cin>>N;
for(int i=1;i<=N/2+1;i++) //i<=n/2+1会漏掉一个解:N本身,所以res初始化为1
dp(N,i);
cout<<res<<endl;
return 0;
}

/*
DESCRIPTION:
几个连续的数之和为N
可以用dp
dp(a,i)表示以i为开头的,和为a的连续子序列的数量
dp(a,i) = dp(a-i,i+1) (a>=i)
边界: i<j 都有 dp(i,j)=0;
用记忆化搜素会更高效一些
复杂度应该是O(n*sqrt(n))的,但实际上应该少的多
*/

暂时只有这两题,但是方法各不相同,怕混淆,做个笔记

时间: 2024-10-13 22:53:56

相加之和为某个数n,求方法数 ------------ 动态规划的方法的相关文章

换钱方法数(有限制条件和无限制条件)

1.  先说一下有限制的 /* 给定一套货币(面值不同的一组货币) vector<int> moeys,以及每种货币的数量vector<int> cnts,求出组合成目标tar的方法数 动态规划思想: dp[i][j]表示用货币moneys[0~i] 组合成 tar 的方法数 dp的规模是:dp[moneys.size()][tar+1] <1> 初始化第一行,dp[0][j], 用moneys[0] 组成j的方法数, moneys[0]只能组成其整数倍的钱数 <

26.一个正整数如果恰好等于它的因子之和,这个数称为“完数”,如6=1+2+3,求1000以内所有的完数.

?#include<iostream> using namespace std; int main() { for(int i=1;i<=1000;i++) { int sum=0; for(int j=1;j<i;j++) { if(i%j==0) { sum+=j; } } if(sum==i) { cout<<i<<" "<<endl; } } return 0; } 26.一个正整数如果恰好等于它的因子之和,这个数称为

【算法C++】检测数组里是否有两个数之和等于某个数

问题: 检测数组里是否有两个数之和等于某个数 解决方法一:先将数组排序,然后从两头开始遍历 数组排序后,从左端开始取最小值,从右端取最大值, 判断两者之和与目标的大小: 1. 等于时,输出两个数: 2. 大于时,右端移到第2个数,继续判断: 3. 小于时,左端移到第2个数,继续判断. #include <iostream> #include <string> #include <algorithm> using namespace std; void fun1(int

题目:一个数如果恰好等于它的因子之和,这个数就称为 &quot;完数 &quot;。例如6=1+2+3.编程&#160;&#160;&#160;&#160; 找出1000以内的所有完数。

题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程     找出1000以内的所有完数. 1 package day11_2; 2 3 public class lianxi09 { 4 public static void main(String[] args) { 5 6 for (int i = 1; i < 1000; i++) { 7 int sum=0; 8 for (int j = 1; j <i; j++) { 9 10

Codeforces 126D Fibonacci Sums 求n由任意的Sum(fib)的方法数 dp

题目链接:点击打开链接 题意: 给定一个数n 问把这个数拆成多个不相同的fibonacci数 有多少种拆法 #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<set> #include<queue> #include<vector> #include<m

从键盘录入几个数,求取最大值?

首先声明一个方法名compare1的方法(也可以直接在main函数中执行) public static void compare1() {/*** 从键盘录入几个数,求取最大值*/System.out.println("从键盘录入5个数:");Scanner sc = new Scanner(System.in);int arr[] = new int[5];for(int i = 0;i<5;i++) {arr[i] = sc.nextInt();}System.out.pri

一个数如果恰好等于它的因子之和,这个数就称为&quot;完数&quot;。 例如,6的因子为1、2、3,而6=1+2+3,因此6是&quot;完数&quot;。 编程序找出N之内的所有完数,

题目描述 一个数如果恰好等于它的因子之和,这个数就称为"完数". 例如,6的因子为1.2.3,而6=1+2+3,因此6是"完数". 编程序找出N之内的所有完数,并按下面格式输出其因子: 输入 N 输出 ? its factors are ? ? ? 样例输入 1000 样例输出 6 its factors are 1 2 3 28 its factors are 1 2 4 7 14 496 its factors are 1 2 4 8 16 31 62 124

POJ 2388 Who&#39;s in the Middle(水~奇数个数排序求中位数)

题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: 1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int main() 5 { 6 int n; 7 while(scanf("%d",&n)!=EOF) 8 { 9 int na[n+1]; 10 for(int i=0; i

编程题:已知一个一维数组a[10]中有10个数,求出第m个数到第n个数的和。其中m、n由键盘输入。

#include<stdio.h> int sum(int *q,int n) { int i,s=0; for(i=0;i<n;i++,q++) s+=*q; return s; } void main() { int n,m,a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; printf("Please input m and n(m<n<10):\n"); scanf("%d,%d",&m,&am