2 条题解
-
1
思路:
考过的原题非常有意思的完全背包题,定义背包容量为 ,物品即为给出的 个数,每个数的花费即为需要火柴棍的数量,那么我们定义 dp 数组, 表示花费为 时的最大数,
应该不需要我多讲,我们发现,因为拼出来的数很大,所以可以用 string 类型存储,注意开一个结构体维护 string 型长度,初始置为无穷小,因为我们要刚好用完火柴棍。code
#include<iostream> #include<algorithm> using namespace std; const int N=1e4+10; struct node{ string s; int len=-0x7fffffff;//初始化为负无穷 } dp[N]; int map_[10]={6,2,5,5,4,5,6,3,7,6};//0到9所需火柴数,当然0不用 int num[10]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=m;i++) cin>>num[i]; sort(num+1,num+m+1); dp[0].len=0; for(int i=1;i<=m;i++)//妥妥的完全背包板子 { for(int v=map_[num[i]];v<=n;v++) { if(dp[v-map_[num[i]]].len+1>=dp[v].len) //状态转移,长度越长越好,还要保证最大 dp[v]=(node){(char)(num[i]+48)+dp[v-map_[num[i]]].s,dp[v-map_[num[i]]].len+1}; } } cout<<dp[n].s; return 0; } -
-1
讲个笑话:题解编译错误
为了防止有人不知道如何改,把修改了的代码贴上来
#include<bits/stdc++.h> using namespace std; const int N=1e4+10; struct node{string s;int len;}f[N]; int us[10]={6,2,5,5,4,5,6,3,7,6}; int num[10]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++)f[i].len=-0x3f3f3f3f; for(int i=1;i<=m;i++)cin>>num[i]; sort(num+1,num+m+1); f[0].len=0; for(int i=1;i<=m;i++) { for(int v=us[num[i]];v<=n;v++)if(f[v-us[num[i]]].len+1>=f[v].len) { f[v]={(char)(num[i]+'0')+f[v-us[num[i]]].s,f[v-us[num[i]]].len+1}; } } cout<<f[n].s; return 0; }
- 1
信息
- ID
- 11623
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 3
- 上传者