【题目链接】活动 - AcWing
输入样例1:
20
输出样例1:
2
输入样例2:
15
输出样例2:
0
输入样例3:
0
输出样例3:
1
【代码】
//1023.买书——完全背包问题#include<bits/stdc++.h>using namespace std;int a[5]={0,10,20,50,100};int dp[5][1010];int main(){int n;cin>>n;dp[0][0]=1;for(int i=1;i<=4;i++){for(int j=0;j<=n;j++){dp[i][j]=dp[i-1][j];if(j>=a[i]) dp[i][j]+=dp[i][j-a[i]];} } cout<<dp[4][n];return 0;}
【完全背包优化后代码】
//优化后
//1023.买书——完全背包问题
#include<bits/stdc++.h>
using namespace std;
int a[5]={0,10,20,50,100};
int dp[1010];
int main()
{int n;cin>>n;dp[0]=1;for(int i=1;i<=4;i++){for(int j=a[i];j<=n;j++){dp[j]+=dp[j-a[i]];} } cout<<dp[n];return 0;
}
【相似题目——AcWing1371.货币系统】
【题目链接】 1371. 货币系统 - AcWing题库
输入样例:
3 10
1 2 5
输出样例:
10
【代码及注释】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll dp[30][N];
int v[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>v[i]; }dp[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j];//不选择第i个物品if(j>=v[i]) dp[i][j]+=dp[i][j-v[i]]; }}cout<<dp[n][m];return 0;
}
【优化后代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll dp[N];
int v[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>v[i]; }dp[0]=1;for(int i=1;i<=n;i++){for(int j=v[i];j<=m;j++){dp[j]+=dp[j-v[i]]; }}cout<<dp[m];return 0;
}