题意:给你总价n和k,k代表有价格为1到k的k种物品,求用n块可以的买物品情况总和。
题解:打表找规律,可以得出公式 , i 为i种物品,j 为j块钱。由于数字过大需要用两个dp来存。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define ll long long
using namespace std;
ll a[110][1010],b[110][1010];
ll mod = 1e18;
int main(){
int n,k;
cin>>n>>k;
for(int i = 1 ; i <= k ; i++){
b[i][0] = 1;
}
for(int i = 1 ; i <= k ; i++){
for(int j = 1 ; j <= n ; j++){
if(i>j){
a[i][j] = a[i-1][j];
b[i][j] = b[i-1][j];
}else{
a[i][j] = a[i-1][j] + a[i][j-i] + (b[i-1][j] + b[i][j-i])/mod;
b[i][j] = (b[i-1][j] + b[i][j-i])%mod;
}
}
}
// for(int i = 0 ; i <= k ; i++){
// for(int j = 0 ; j <= n ; j++){
// cout<<b[i][j];
// }
// cout<<endl;
// }
if(a[k][n]) cout<<a[k][n];
cout<<b[k][n]<<endl;
}