本文主要是介绍【RQNOJ 5201】数字组合【DP】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意:
题目链接:http://www.rqnoj.cn/problem/270
给出 n n n个数,求取出几个数使得它们的和为 m m m的方案数。
思路:
很明显是01背包的变形。设 f [ i ] f[i] f[i]表示和为 i i i时的最大答案,那么就有状态转移方程: f [ i ] + = f [ i − a [ j ] ] ( i > = a [ j ] ) f[i]+=f[i-a[j]](i>=a[j]) f[i]+=f[i−a[j]](i>=a[j])
最终答案为 f [ m ] f[m] f[m]。
代码:
#include <cstdio>
using namespace std;int n,m,f[10001],a[101];int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&a[i]);f[0]=1;for (int j=1;j<=n;j++)for (int i=m;i>=a[j];i--) //最少度只能从f[i-a[j]]转移而来,所以只要循环到a[j]f[i]+=f[i-a[j]];printf("%d\n",f[m]);return 0;
}
这篇关于【RQNOJ 5201】数字组合【DP】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!