洛谷P7223 [RC-04] 01 背包
[RC-04] 01 背包
题目描述
‘有一个容积为
你有
你有一个幸运数字
求所有
输入格式
第一行两个整数
接下来一行
输出格式
输出一个整数,为所有
样例 #1
样例输入 #1
2 2
1 4
样例输出 #1
51
提示
【样例解释】
答案为
【数据范围】
对于所有数据,
详细数据范围如下表:
测试点编号 | 每测试点分数 | |||
---|---|---|---|---|
解析
递归枚举所有方案
所有的方案个数为
理想情况下,最多只能拿到测试点编号2~5的分数
注意要对MOD
使用finnal
关键字
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static int n;
static int p;
static int[] w;
static long ans = 0;
static final int MOD = 998244353;//一定要用final关键字!!!
public static void main(String[] args) {
n = sc.nextInt();
p = sc.nextInt();
w = new int[n];
for (int i = 0; i < n; ++i) {
w[i] = sc.nextInt();
}
dfs(0,0);
System.out.println(ans);
}
static void dfs(int len, long sum) {
if (len == n) {
ans = (ans + pow(p, sum)) % MOD;
return;
}
dfs(len + 1, sum);//如果不选择当前物品
dfs(len + 1, sum + w[len]);//如果选择当前物品
}
static long pow(long x, long n) {//尽量使用位运算优化
long ans = 1;
for (; n != 0; n >>= 1, x = x * x % MOD) {
if ((n & 1) == 1) ans = ans * x % MOD;
}
return ans;
}
}
数学推导
前
以下关注
的性质 设每种方案的总体积为
,其中 则
对于所有方案都增加
体积 则总收益变为
所以,若每种方案的体积都增加
,相当于乘以
考虑第
每种物品仅有两种情况
- 不选该物品,由于任意一种方案的物品总体积不变,则对
无影响 - 选择该物品,对任意一种方案的物品总体积增加
,则
则
由累乘法得:
而
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static final long MOD = 998244353;
static int n;
static long ans = 1l, p;
static int[] V;
static long powMod(long a, int b) {
long ret = 1;
for (; b != 0; b >>= 1, a = a * a % MOD)
if ((b & 1) == 1) ret = ret * a % MOD;
return ret;
}
public static void main(String[] args) {
n = sc.nextInt();
p = sc.nextLong();
V = new int[n];
for (int i = 0; i < n; ++i) V[i] = sc.nextInt();
for (int v : V) ans = ans * (1l + powMod(p, v)) % MOD;
System.out.println(ans);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人