您的位置:首页 > 其它

hdu 1284 钱币兑换问题 完全背包

2013-08-11 00:40 423 查看

钱币兑换问题

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 4312 Accepted Submission(s): 2438



[align=left]Problem Description[/align]
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。

[align=left]Input[/align]
每行只有一个正整数N,N小于32768。

[align=left]Output[/align]
对应每个输入,输出兑换方法数。

[align=left]Sample Input[/align]

2934
12553


[align=left]Sample Output[/align]

718831
13137761


看题,发现不计数量,那就是完全背包的问题了。。不过自己还是想不出来状态转移方程。
看了大牛的方法 :
dp[j]=dp[j]+dp[j-i];

其实就是依次采用1分 2分 3分的。
每一次要达到 j 元,要么就是不采用第i分,要么就是采用第i分,所以就要加上 j-i 分的方法数。

为什么DP【0】等于1呢 因为要产生0元的情况只有一种 就是 0个1分 0个2分 0个3分(即 0 0 0 )
其实DP就是在思考一个能得到当前状态最优解的状态转移方程,要学会思考。

这道题还有还有很多做法,什么母函数什么的 可惜我不会。。

#include<iostream>
#include<cstdio>
using namespace std;
int dp[40000];
int main()
{
memset(dp,0,sizeof(dp));
int i,j,n;
dp[0]=1;
for(i=1;i<=3;i++)
{
for(j=i;j<32768;j++)
{
dp[j]=dp[j]+dp[j-i];
}
}
while(~scanf("%d",&n))
{
cout<<dp
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: