回溯解法如下:
public class Main {
static int count=0;
public static void main(String[] args) {
String s="aaa";
int index=1;
StringBuilder sb=new StringBuilder();
sb.append(s.substring(index+1));
System.out.println(sb);
Scanner in = new Scanner(System.in);
int n,m;
n = in.nextInt();
m = in.nextInt();
int[][] candy=new int[n][2];
for(int i=0;i<n;i++){
candy[i][0]=in.nextInt();
candy[i][1]=in.nextInt();
}
for(int i=0;i<n;i++){
m-=candy[i][0];
candy[i][1]-=candy[i][0];
}
helper(n,m,candy,0,0);
System.out.println(count);
}
static void helper(int n,int m,int[][] candy,int size,int index){
System.out.println("index"+index);
System.out.println("size"+size);
if(size==m) {
count++;
System.out.println("count"+count);
return;
}
for(int i=index;i<n;i++){
if(candy[i][1]>0){
candy[i][1]--;
helper(n,m,candy,++size,i);
candy[i][1]++;
size--;
}
}
}
}
DP解法如下:
public class AiQYI3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 颜色种类
int m = scanner.nextInt();// 盒子放置m个糖果
int[] l = new int[n];
int[] r = new int[n];
int least = 0;
int[] avaliable = new int[n];// 表示每一种颜色剩余可以加的
for (int i = 0; i < r.length; i++) {
l[i] = scanner.nextInt();
r[i] = scanner.nextInt();
least += l[i];
avaliable[i] = r[i] - l[i];
}
int target = m - least; //dp[i][j]表示前i种糖果装满容量为j的背包的方法数。一定要用long,不然会爆,只能过70% long[][] dp = new long[n + 1][target + 1];
for (int i = 0; i < dp.length; i++) {
dp[i][0] = 1;//初始化
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= target; j++) {
for (int k = 0; k <= avaliable[i - 1]; k++) {
if (j - k >= 0)
dp[i][j] += dp[i - 1][j - k];
}
}
}
System.out.println(dp[n][target]);
}
}
想明白再写。