package 爱奇艺;
import java.util.Scanner;
public class Main3 {
//给定糖果种类和一盒需要装的糖果
//后面n-1行为每种糖果在盒子里面的下限和上限
//求一共有多少中方案可以使盒子放满
public static void main(String[] args) {
//给定糖果和总数,并且每种糖果的数量有所限制,求一共有多少拼凑方案
//类似背包问题
Scanner sc = new Scanner(System.in);
//颜色种类
int kind=sc.nextInt();
int [][] candles=new int[kind][2];
//可放置糖果总数
int amount=sc.nextInt();
//用来表示每种糖果可以用的总数
int [] avaliable=new int[kind];
int least=0;
for(int i=0;i<kind;i++){
//下限
candles[i][0]=sc.nextInt();
//上限
candles[i][1]=sc.nextInt();
avaliable[i]=candles[i][1]-candles[i][0];
//最小总糖果总数
least+=candles[i][0];
}
//表示需要背包的数量
int target=amount-least;
//完全背包问题
int [][] dp=new int[kind+1][target+1];
for(int i=0;i<dp.length;i++){
//初始化(因为混合背包,需要初始化)
dp[i][0]=1;
}
for(int i=1;i<=kind;i++){
for(int j=1;j<=target;j++){
for(int k=0;k<=avaliable[i-1];k++){
if(j>=k){
//说明可用
dp[i][j]+=dp[i-1][j-k];
}
}
}
}
System.out.println(dp[kind][target]);
}
}
爱奇艺2018春招实习_编程3_组合背包问题
最新推荐文章于 2019-10-21 20:48:52 发布