SDUT 1223-找零钱(DP)

来源:互联网 发布:openwrt p2p端口 编辑:程序博客网 时间:2024/04/28 04:40

题目链接:点击打开链接

还是硬币问题。只不过多了一个限制条件是要求组成n的硬币个数不超过100.考虑dp ,可以在一维的基础上增加一个维度,即设 dp[i][j] 为所用硬币为i个表示j 的种类数 。

dp[i][j]=dp[i][j]+dp[i-1][j-v[k]],依旧是枚举硬币种类。

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#include <cctype>#include <vector>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>#define maxn 1<<12#define _ll __int64#define ll long long#define INF 0x3f3f3f3f#define Mod 1000000007#define pp pair<int,int>#define ull unsigned long longusing namespace std;int n,dp[101][251];int v[]={1,2,5,10,20,50,100};void solve(){memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=0;i<7;i++)for(int num=1;num<=100;num++)for(int j=v[i];j<=n;j++)dp[num][j]+=dp[num-1][j-v[i]];int ans=0;for(int i=0;i<=100;i++)ans+=dp[i][n];printf("%d\n",ans);}int main(){while(~scanf("%d",&n)&&n)solve();    return 0;}


1 0
原创粉丝点击