您的位置:首页 > 移动开发 > IOS开发

USACO :Money Systems解题报告

2010-06-25 10:58 357 查看
背包DP,若定义dp
[k]为用前k种货币组成n的方法数,则状态转移方程为:

    dp
[k] = dp
[k-1] + dp[n-c_k][k],其中c_k为第k 种货币的币值。

即:前k种货币组成n的方法数 = 前k-1种货币组成n的方法数 + 前k种货币组成n-c_k的方法数

关键需要理解的地方是:dp[n-c_k][k] 包含了 dp[n-i*c_k][k]所有的方法数

边界条件为:dp[0][k] = 1

 

/*

ID: xpli1

PROG: money

LANG: C++

*/

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

#define IN    cin

#define OUT    cout

#define max(a,b) (((a) > (b)) ? (a) : (b))

ifstream fin ("money.in", ios::in);

ofstream fout("money.out",ios::out);

int v,n,p;

long long dp[10001];

int main(){

 IN >> v >> n;

 

 int i,j;

 dp[0] = 1;

 for(i = 1; i <=v; i++) {

  

  IN >> p;

  

  for(j = p; j <= n; j++){

   

   dp[j] += dp[j-p];

  }

 }

 OUT << dp
<< endl;

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios c