1 条题解

  • 1
    @ 2022-7-30 13:31:33

    不多说 答案是两部分! 答案是两部分! 答案是两部分! 最少数+方案! dfs自己写吧

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,a[50],k[50][50],vis[20],ans = 100,p[20];
    bool check()
    {
    	for(int i=1; i <= n; i++)
    	{
    		int c = 0;
    		for(int j=1; j <= m ;j++)
    		{
    			c += k[j][i] * vis[j];
    		}
    		if(c < a[i])
    		{
    			return false;
    		}
    	}
    	return true;
    }
    void dfs(int num,int k)
    {
    	if(check())
    	{
    		if(ans > num)
    		{
    			ans = num;
    			for(int i=1; i <= m;i++)
    			{
    				p[i] = vis[i];
    			}
    		}
    	}
    	if(k > m)
    	{
    		return;
    	} 
    	for(int i=k; i <= m ;i++)
    	{
    		vis[i] = 1;
    		dfs(num+1,i+1);
    		vis[i] = 0;
    	}
    }
    int main()
    {
    	cin >> n;
    	for(int i=1; i<= n ;i++)
    	{
    		cin >> a[i];
    	}
    	cin >> m;
    	for(int i=1; i<= m; i++)
    	{
    		for(int j=1; j <= n ;j++)
    		{
    			cin >> k[i][j];
    		}
    	}
    	dfs(0,1);
    	cout << ans << " ";
    	for(int i=1; i <= m;i++)
    	{
    		if(p[i])
    		{
    			cout << i << " ";
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1626
    时间
    1000ms
    内存
    125MiB
    难度
    1
    标签
    递交数
    75
    已通过
    55
    上传者