1 solutions
-
0
C++ :
#include <bits/stdc++.h> using namespace std; /* 将要凑出的数看成背包的容量 所有可以用的物品是1~n n个物品 每个物品的体积是 1~n 问题转换为:给定1~n,n个物品,背包容量为n,求装满背包的方案数 由于每个数可以选多次,该问题就是完全背包的问题 DP分析法: (1)状态表示:f[i,j] 集合:所有从前i个物品选,且总体积恰好是j的所有选择方案的集合 属性:集合中元素的数量 (2)状态计算: 所有不包含第i个物品的方案:f[i-1,j] 所有包含第i个物品的方案:f[i-1,j-k*vi]:可以考虑为第i个物品一定有,那么就转换为在i-1个物品的情况下,凑出背包容量为j-k*vi的方案数 因此:f[i,j] = f[i-1,j] + f[i-1,j-k*vi] 可以用滚动数组优化: */ long long base=2147483648LL;//默认数字为int类型,因此数字后要加LL int n; long long f[4005]; int main(){ cin>>n; f[0]=1; for(int i=1;i<n;i++) for(int j=i;j<=n;j++) f[j]=(f[j]+f[j-i])%base; cout<<f[n]; }
- 1
Information
- ID
- 9945
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By