问题 5206 --等值交换

5206: 等值交换★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 7  解决: 5
[提交][状态][命题人:]

题目描述

【C++】

#include <bits/stdc++.h>
using namespace std;
long long n,a[1010],m;
void print(stack<int> Temp)
{
	if(Temp.empty()) return;
	int T=______(1)______;
	Temp.pop();
	print(Temp);
	printf("%d ",T);
}
void exchange()
{
	stack<int> arr;
	int i=0,num=0;
	while (______(2)_______)
	{
		while(m>0 && i<n)
		{
			if(m>=a[i])
			{
				arr.push(i);
				______(3)_______;
			}
			i+=1;
			if(m==0)
			{
				stack<int> arrT=arr;
				print(arrT);
				printf("\n");
				num+=1;
			}
		}
		if(______(4)_______)
		{
			i=arr.top();
			arr.pop();
			m+=a[i];
			_____(5)______;
		}
	}
	if(num==0)
		puts("No");
	else
		printf("%d\n",num);
}
int main() 
{
	cin>>m>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	exchange();
	return 0;
}


【Python】

def exchange(t,pricelist):
    n=len(pricelist)
    stack=[]
    i=0
    num=0
    while _____(1)_______:
        while t>0 and i<n:
            if t>=int(pricelist[i]):
                stack.append(i)
                ______(2)________
            i+=1
            if t==0:
                print(stack)
                num+=1
        if _____(3)________:
            i=stack.pop()
            t+=int(pricelist[i])
            ______(4)_______
    if num==0:
        print('No')
m=int(input())  #目标置换物品的价值
price=input() #已获得物品价值依次是
p=price.split(',') #将输入的内容以','作分隔,并转换为列表
exchange(m,p)


输入

第一行两个整数m和n,分别表示目标置换物品的价值,以及已获得物品的总的类别数

第二行为每类物品的价值,一共n个数

输出

每种方案分别取了哪几类物品,分别列出对应的编号,空格隔开,按字典序排序

最后一行输出一共满足条件的方案总数

样例输入
Copy
35 8
1 2 5 7 9 10 15 20
样例输出
Copy
0 1 2 3 7 
0 1 3 5 6 
0 2 4 7 
0 4 5 6 
2 5 7 
6 7 
6

提示

来源

[提交][状态]