标签:2229 int 凑出 POJ Maxn include Sumsets dp define
Sumsets
直接翻译了
Descriptions
Farmer John 让奶牛们找一些数加起来等于一个给出的数N。但是奶牛们只会用2的整数幂。下面是凑出7的方式1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4
5) 1+2+2+2
6) 1+2+4
帮助FJ找到 N的分配数 (1 <= N <= 1,000,000).
Input
NOutput
排列方式总数。由于这个数可能很大,只需要保留最后9位Sample Input
7
Sample Output
6
Hint
打表的会被系统自动识别判为WA
题目链接
https://vjudge.net/problem/POJ-2229
处理出2的幂次方的所有的数字,当做物品,每个物品次数不限,求凑出体积为N的方案数
类似完全背包,先枚举物品,再正序枚举体积,转移状态dp[i][j]表示前i件物品凑出的体积为j的方案数
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - w[i]]
1<<i 相当于 2i
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 1000005 using namespace std; int n; int w[Maxn]; int cnt=0; int dp[Maxn]; int main() { scanf("%d",&n); for(int i=0;(1<<i)<=n;i++)//构造所有物品 w[cnt++]=(1<<i); dp[0]=1; for(int i=0;i<cnt;i++) for(int j=w[i];j<=n;j++) dp[j]=(dp[j]+dp[j-w[i]])%1000000000;//取余 printf("%d\n",dp[n]); return 0; }
标签:2229,int,凑出,POJ,Maxn,include,Sumsets,dp,define 来源: https://www.cnblogs.com/sky-stars/p/11335573.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。