2 条题解

  • 1
    @ 2026-6-2 0:41:30

    思路:

    考过的原题

    非常有意思的完全背包题,定义背包容量为 nn,物品即为给出的 mm 个数,每个数的花费即为需要火柴棍的数量,那么我们定义 dp 数组,dp[v]dp[v] 表示花费为 vv 时的最大数,应该不需要我多讲,我们发现,因为拼出来的数很大,所以可以用 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
      @ 2026-6-2 18:21:21

      讲个笑话:题解编译错误

      为了防止有人不知道如何改,把修改了的代码贴上来

      #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
      上传者