分组背包问题
注意边界和起始值为1就可
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <set>
#include<cmath>
using namespace std;
const int N = 550;
typedef long long ll;
bool st[N];
int dp[N][N],dis[N];
int a[N],b[N];
int n,m,k;
int x,y;
const int inf = 0x3f3f3f3f;
vector<int> vec;
int main()
{ cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
cin>>k;
dp[0][0]=1;
for(int i=1;i<=n;i++){
dp[i][0]=1;
for(int j=0;j<=k;j++){
for(int q=0;q<=b[i];q++){
if(q*a[i]<=j&&dp[i-1][j-q*a[i]]){
dp[i][j]=1;
}
}
}
}
cout<<dp[n][k];
return 0;
}
/*3
3 5 8
3 2 2
17*/