OJ-195-buyer

在这里插入图片描述
在这里插入图片描述
//递归实现所有情况的组合,随后比较返回最大的value
//用flag标记该物品是否被选,如果value比较结果小,则返回重新置零

#include<stdio.h>
struct a{
	int cost,x;
	int flag;
}a[1005];
int f(struct a ans,int i,struct a a[1005],int flag,int m,int n){
	int max1=0,max2=0;
	a[i].flag=0;
	if(i==n) return ans.x;
	if(m<a[i].cost||flag==0){
		max1=f(ans,i+1,a,0,m,n)>f(ans,i+1,a,1,m,n)?f(ans,i+1,a,0,m,n):f(ans,i+1,a,1,m,n);
	}
	else if(m>=a[i].cost&&flag==1){
		a[i].flag=1;
		m-=a[i].cost;
		ans.x+=a[i].x;
		max2=f(ans,i+1,a,0,m,n)>f(ans,i+1,a,1,m,n)?f(ans,i+1,a,0,m,n):f(ans,i+1,a,1,m,n);
	}
	return max1>max2?max1:max2;
}
int main(){
	int m,n,res1,res2;
	while(~scanf("%d %d",&m,&n)){
		struct a ans;
		ans.cost=0;
		ans.x=0;
		for(int i=0;i<n;i++) scanf("%d %d",&a[i].cost,&a[i].x);
		res1=f(ans,0,a,0,m,n);
		res2=f(ans,0,a,1,m,n);
		int res=res1>res2?res1:res2;
		if(res==0) printf("0\n");
		else{
			printf("%d\n",res);
			int t=0;
			for(int i=0;i<n;i++){
				if(a[i].flag==1&&t==0) {
					printf("%d",i+1);
					t=1;
				}
				else if(a[i].flag==1)printf(" %d",i+1);
			}
			printf("\n");
		} 
	
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值