void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一些钱币的价值,都是一些完全平方数1,4,9...

然后输入一个数,问你用这些完数能组成这个数的种类有多少钟?

一般来讲,填充性问题都是背包的,这个也不例外,简单的完全背包问题

转移方程dp[k]+=dp[k-w[i]];  k价值的种类等于(k-w[i])的种类的和

View Code
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <iostream>
4 #include <limits.h>
5 #include <string.h>
6 #include <algorithm>
7  using namespace std;
8  int main()
9 {
10 int n;
11 int dp[310];
12 int c[20];
13 memset(dp,0,sizeof(dp));
14 for(int i=1; i<=17; i++)
15 c[i] = i*i;
16 dp[0] = 1; //能减到0的必然是下标是平方数的
17   for(int i=1; i<=17; i++)
18 for(int k=c[i]; k<=300; k++)
19 dp[k] += dp[k-c[i]];
20 while( ~scanf("%d",&n) && n )
21 {
22 printf("%d\n",dp[n]);
23 }
24  return 0;
25 }
posted on 2011-05-07 17:06  void-man  阅读(325)  评论(0)    收藏  举报