UVA11137

 1 /*
 2 题意; 由题可知21种货币, 给出N,问有多少种组合方式。
 3 简单DP以前写过啊w(?Д?)w,又纠结好久才发现转移方程那里的 += 写成 = 。(- -||)
 4 转移方程 dp[j] += dp[j-w[i]] ;
 5 对于每一种货币,组合方式等于现有的加上之前有的 。
 6  */
 7 #include<cstdio>
 8 #include<cstring>
 9 #include<algorithm>
10 #define INF -999999999
11 using namespace std;
12 long long w[30],f[10005];
13 int main()
14 {
15     int n;
16     for(int i=1;i<=21;i++)
17         w[i]=i*i*i;
18     while(scanf("%d",&n)!=EOF)
19     {
20         memset(f,0,sizeof(f));
21         f[0]=1;
22         for(int i=1;i<=21;i++)
23         {
24             for(int j=w[i];j<=n;j++)
25             {
26                 if(f[j-w[i]]) f[j]+=f[j-w[i]];
27             }
28         }
29         printf("%lld\n",f[n]);
30     }
31     return 0;
32 } 
时间: 2024-10-06 10:51:20

UVA11137的相关文章

2.2 立方数之和 UVa11137

1.题目描述:点击打开链接 2.解题思路:本题利用递推关系解决.建立一个多段图,定义状态d(i,j)表示"使用不超过i的整数的立方,累加和为j"的方案数.那么根据加法原理,如果没有选择数字i的立方和就得到了j,那么方案数就是d(i-1,j):如果选择了数字i的立方和才得到了j,那么方案数是d(i,j-i^3).即: d(i,j)=d(i-1,j)+d(i,j-i^3); 这个递推式还可以降低维度,利用滚动数组计算.由递推式可知,i,j都需要从小到大计算,而更新i的时候,d(j)保存的是

完全背包——方案个数 UVA11137 Ingenuous Cubrency

题目描述如下 : 代码如下: #include <stdio.h> unsigned long long int dp[10001] ; int main (){ int i,j ,k ; int v[22]; int n ; for (i = 1 ; i < 22 ; i ++) v[i] = i*i*i ; dp [0] = 0 ; for ( i = 1 ; i <=21 ; i ++ ){ for ( j = 0 ; j<10001 ; j ++ ){ if ( j&

UVA11137 Ingenuous Cubrency

题意 PDF 分析 考虑dp. 用\(d(i,j)\)表示用不超过i的立方凑成j的方案数. \(d(i,j)=d(i-1,j)+d(i,j-i^3)\) 时间复杂度\(O(IN+T)\) 代码 #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<set> #include<map> #include<queue> #i

小白书关于动态规划

10192 最长公共子序列 http://uva.onlinejudge.org/index.php?option=com_onlinejudge& Itemid=8&page=show_problem&category=114&problem=1133&mosmsg= Submission+received+with+ID+13297616 */ #include <cstdio> #include <string.h> #include&

相加之和为某个数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