标签:
用给定的面值的纸币,组成总值为N的情况,有多少种组法,每张纸币数量没有限制,思路类似完全背包。
dp[i][j]表示在前i中纸币中,组成总值为j的方法数。每次更新时都得枚举,第i张纸币,只用1张时的组合数,只用两张时,用三张时,为了省去枚举的麻烦,可以直接使用完全背包的优化方法。
/* ID: modengd1 PROG: money LANG: C++ */ #include<iostream> #include<cstring> #include<cstdio> #define MAXN 30 #define MAXV 10010 using namespace std; long long dp[MAXV]; int a[MAXN]; int main() { freopen("money.in","r",stdin); freopen("money.out","w",stdout); int N,V; scanf("%d %d",&N,&V); memset(dp,0,sizeof(dp)); for(int i=0;i<N;i++) scanf("%d",&a[i]); dp[0]=1; for(int i=0;i<N;i++) { for(int j=a[i];j<=V;j++) { dp[j]+=dp[j-a[i]]; } } printf("%lld\n",dp[V]); return 0; }
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4782586.html