码迷,mamicode.com
首页 > 其他好文 > 详细

多重部分和问题

时间:2019-05-23 18:25:40      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:back   --   bit   alt   src   pen   efi   name   个数   

  题意:有n种不同大小的数字ai 每种各mi个 判断是否可以从这些数字之中选出若干个使它们的和恰好为K

 

朴素做法  为三次方

有一种 nK的做法:

dp[i][j]表示 前i个数  凑到j最多剩下多少个mi

 

dp[i][j]

1.如果dp[i][j]>=0 那么肯定为mi

2.如果 j<ai or  dp[i][j-ai]]<=0 那么为-1  表示无解

3. 其他情况  dp[i][j-ai]]-1;

技术图片
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=100+5;
int n,m,dp[N];
int a[N],m[N],K;
int main()
{
    RI(n,K);
    rep(i,1,n)RI(a[i]);
    rep(i,1,n)RI(m[i]);
    
    CLR(dp,-1);
    dp[0]=0;
    rep(i,1,n)
    rep(j,0,K)
    if(dp[j]>=0){dp[j]=m[i];}
    else if(j<a[i]||dp[j-a[i]]<=0){dp[j]=-1;}
    dp[j]=dp[j-a[i]]-1;
    
    if(dp[K]>=0)printf("Yes\n");
    else printf("No\n");
    
    return 0;
}
View Code

 

多重部分和问题

标签:back   --   bit   alt   src   pen   efi   name   个数   

原文地址:https://www.cnblogs.com/bxd123/p/10913559.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!