uva11137Ingenuous Cubrency(完全背包)

题目:Ingenuous Cubrency

题目大意:给出一类钱,面值有1, 8, 27... (21)^3这21种,然后给出N,问N可以有多少组成方式。

解题思路:dp【i】代表面值为i的最多有多少种组合方式,状态转移方程:dp【i】 += dp【i - value【1...21]].  如果要组成i值的话,那么它一定是由之前的状态(i - value【j】)加上现有的面值组成。所以只要遍历一边面值,将之前的状态找出来,然后累加起来就可以了。这里可以用递推,因为状态的计算顺序是知道的。

代码:

#include <cstdio>
#include <cstring>
#include <cmath>

const int N = 21;
const int maxn = 10000;
typedef long long ll;
int value[N];
ll dp[maxn];

void init () {

	for (int i = 0; i < N; i++)
		value[i] = pow (i + 1, 3);

	memset (dp, 0, sizeof (dp));
	dp[0] = 1;
	for (int i = 0; i < N; i++) {

		for (int j = 1; j < maxn; j++) {

			if (j >= value[i])
				dp[j] += dp[j - value[i]];
		}
	}
}

int main () {

	init ();
	int n;
	while (scanf ("%d", &n) != EOF) {

		printf ("%lld\n", dp[n]);
	}
	return 0;
}

uva11137Ingenuous Cubrency(完全背包)

时间: 2024-08-11 09:51:05

uva11137Ingenuous Cubrency(完全背包)的相关文章

uva--11137Ingenuous Cubrency ---dp

多重背包求最优解问题. 代码如下: <span style="font-size:18px;">#include<iostream> #include<cstdio> #include<cstring> using namespace std; int V; long long sum[110000]; int w[50]; void Init() { memset(sum,0,sizeof(sum)); sum[0]=1; } void

递推关系的运用加简单DP【UVA11137Ingenuous Cubrency】-------2015年1月27日

一:题意描述 本题就是求立方数之和.输入正整数n,求将n写成若干个正整数的立方和有多少种方法? 二:问题分析 本题主要的难点就是确定状态.我们可以建立多段图.节点(i,j)表示“使用不超过i的整数的立方,累加和为j“这个状态.设d(i,j)表示为从(0,0)到(i,j)的路径条数,最终答案 是d(21,n).对于这个图而言,每一个节点(i,j)都只能从当前节点(i,j)到达节点(i+1,a*(j+1)^3+j)(a为j+a*(j+1)^3<maxn的常数)所以我们可以写出如下代码: #inclu

算法入门经典大赛 Dynamic Programming

111 - History Grading LCS 103 - Stacking Boxes 最多能叠多少个box DAG最长路 10405 - Longest Common Subsequence LCS 674 - Coin Change 全然背包求方案数 10003  - Cutting Sticks 区间DP dp[l][r]代表分割l到r的最小费用 116 - Unidirectional TSP 简单递推 输出字典序最小解 从后往前推 10131 - Is Bigger Smarte

uva 11137 Ingenuous Cubrency (完全背包)

uva 11137 Ingenuous Cubrency People in Cubeland use cubic coins. Not only the unit of currency is called a cube but also the coins are shaped like cubes and their values are cubes. Coins with values of all cubic numbers up to 9261 (= 21 3), i.e., coi

UVa 11137 (完全背包方案数) Ingenuous Cubrency

题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动数组来实现 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 10; 8

UVA - 11137 Ingenuous Cubrency[背包DP]

People in Cubeland use cubic coins. Not only the unit of currency iscalled a cube but also the coins are shaped like cubes and their valuesare cubes. Coins with values of all cubic numbers up to 9261(= 213),i.e., coins with the denominations of 1, 8,

完全背包——方案个数 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&

HDU 2189 悼念512汶川大地震遇难同胞——来生一起走(母函数或完全背包)

悼念512汶川大地震遇难同胞--来生一起走 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3773    Accepted Submission(s): 1913 Problem Description 妈妈你别哭泪光照亮不了我们的路让我们自己慢慢的走 妈妈我会记住你和爸爸的模样记住我们的约定来生一起走 上面这首诗节选自一位诗人纪念遇难

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d