![](https://i-blog.csdnimg.cn/blog_migrate/01da6ca3d78b0605c2e32d48a53245f7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/187824b0dde0c0fe8a640f23900f0426.png)
题目练习:
#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9;
int n;
int f[1000005];
int main(){
f[0]=1;
cin>>n;
for(int i=1;i<=n;i*=2){//当前物品所用的体积
for(int j=i;j<=n;j++){
f[j]=(f[j]+f[j-i])%MOD;
}
}
cout<<f[n];
}
//01背包
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1005],f[10005];//f[j] (从前i个数选) 和为j的方案数有多少个
int main(){
f[0]=1;//注意初值位1
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
for(int j=m;j>=a[i];j--){
f[j]=f[j]+f[j-a[i]];
}
}
cout<<f[m];
}
//完全背包
#include<bits/stdc++.h>
using namespace std;
const long long modd=2147483648;
int n;
long long f[4005];//f[j] (从前i个数选) 和为j的方案数有多少个 //注意开long long ,否则会WA
int main(){
f[0]=1;
cin>>n;
for(int i=1;i<n;i++){
for(int j=i;j<=n;j++){
f[j]=(f[j]+f[j-i])%modd;
}
}
cout<<f[n];
}