90pts 求助
查看原帖
90pts 求助
398455
NeNe_楼主2023/6/3 22:06
#include <bits/stdc++.h>
using namespace std;
const int N=30,MAXN=0xfffffff;
int v,g,ans_t=MAXN;
int sd[N],n[N][N],t[N],ans[N];
bool fl[N]={0},flag;
void dfs(int k,int cnt)//第k种饲料,已经选了cnt种饲料
{
	flag=1;
	for(int i=1;i<=v;i++)//判断是否所有维他命数量都符合要求
	{
		if(t[i]<sd[i])
		{
			flag=0; break;
		}
	}
	if(flag==1)
	{
		if(cnt<ans_t)//需要饲料种类更少,则更新答案
		{
			ans_t=cnt;
			for(int i=1,j=0;j<cnt;i++)
			{
				if(fl[i]==1)
				{
					j++;
					ans[j]=i;
				}
			}
		}
	}
	if(k>v) return ;//没有更多饲料选择,结束
	if(cnt>=ans_t) return ;//需要饲料种类比已有情况更多,舍弃
	fl[k]=1;
	for(int j=1;j<=v;j++) t[j]+=n[k][j];
	dfs(k+1,cnt+1);//选择第k个饲料
	fl[k]=0;
	for(int j=1;j<=v;j++) t[j]-=n[k][j];//回溯
	dfs(k+1,cnt);//不选择第k个饲料
}
void print()
{
	cout<<ans_t<<" ";
	for(int i=1;i<=ans_t;i++)
	{
		cout<<ans[i]<<" ";
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>v;
	for(int i=1;i<=v;i++) cin>>sd[i];
	cin>>g;
	for(int i=1;i<=g;i++)
	{
		for(int j=1;j<=v;j++)
		{
			cin>>n[i][j];
		}
	}
	dfs(1,0);
	print();
	return 0;
}

点7 RE,代码与这条帖子思路基本一致,如果MAXN替换为更小的值则会 WA(和上文那一条帖子一样)

点7数据:

5
163 221 146 425 509
10
98 69 68 18 129
132 185 196 64 176
40 70 57 9 115
73 189 145 87 117
45 114 45 0 18
137 137 174 73 178
48 143 33 142 192
33 107 148 2 158
32 42 153 90 41
165 81 156 7 121
2023/6/3 22:06
加载中...