题解:P2409 Y的积木
现存的题解似乎没有用 dp 做的,来补一发。
Solution P2409
Idea
我们设
那么很显然有
最后统计答案的时候,从小到大枚举,对于每一个可行方案让计数器加一,然后判断是否比
这样转移的代码就长这样:
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m[i];j++){
for(int k=a[i][j];k<=maxw;k++){
dp[i][k]=dp[i][k]+dp[i-1][k-a[i][j]];
}
}
}
但是它会 WA 掉最后一组 hack 数据。
我们考虑一下,当 long long
的情况。
那么我们想,最多会有
Code
#include<bits/stdc++.h>
using namespace std;
const int N=105,maxw=10000;
int n,m[N],a[N][N],kk;
int dp[N][N*N];
int main(){
scanf("%d%d",&n,&kk);
for(int i=1;i<=n;i++){
scanf("%d",&m[i]);
for(int j=1;j<=m[i];j++){
scanf("%d",&a[i][j]);
}
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m[i];j++){
for(int k=a[i][j];k<=maxw;k++){
dp[i][k]=min(kk,dp[i][k]+dp[i-1][k-a[i][j]]);//最核心的部分:保存到最大值为 k(代码中为 kk)。
}
}
}
int cnt=0;
for(int i=0;i<=maxw;i++){
for(int j=1;j<=dp[n][i];j++){
cnt++;
printf("%d ",i);
if(cnt==kk)return 0;
}
}
return 0;
}
Time
显然转移是
所以不会超时,但是复杂度也很高。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】