//多重部分和问题
#include<iostream>
using namespace std;
int n;
const int maxn=100010;
int a[maxn];
int b[maxn];
int dp[maxn];
int K;
void init(){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
cin>>K;
}
void solve(){
memset(dp, -1, sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<=K;j++)
if(dp[j]>=0) dp[j]=b[i];
else if(K<a[i]||dp[j-a[i]]<=0) dp[j]=-1;
else dp[j]=dp[j-a[i]]-1;
}
if(dp[K]>=0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main(){
init();
solve();
}
算法入门 9.多重部分和问题
最新推荐文章于 2022-01-02 17:52:51 发布
该博客探讨了一段C++代码,用于解决一个涉及动态规划的数组问题。输入包括两个整数数组a和b,以及一个整数K。代码初始化并解决了一个状态转移方程,根据数组元素更新dp数组,判断在不超过K的情况下,是否可以从a数组中选择元素使得b数组的负值最小。最后,根据dp[K]的值输出"YES"或"NO"来表明是否存在解决方案。
摘要由CSDN通过智能技术生成