蓝桥杯 动态规划+背包

本文介绍了一种算法,用于解决给定购物券金额和多种商品价格时,如何找出所有能够完全消耗购物券金额的购买组合。通过递归方法实现,避免了超支或未用完券额的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。

程序输入:

第一行是一个整数m,代表可购买的商品的种类数。

接下来是m个整数,每个1行,分别代表这m种商品的单价。

程序输出:

第一行是一个整数,表示共有多少种方案

第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。

例如:

输入:

2

200

300

则应输出:

2

2  2

5  0

输入:

2

500

800

则应输出:

1

2  0

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。 

#include <cstdio>   
#include <cstdlib> 
#include <list>
#include <string>
#include <iterator>
#include <iostream>
using namespace std;

int *a,*b;       
int n;   
int count = 0;   

list<string> meanprintf;

void print()   
{   
    int i;
	string temp("");
	char cc;
	for(i = 0; i < n; i++){   
        cc=b[i]+'0';
		temp+=cc;
		if(i!=n-1)
			temp+=' ';
		}
	meanprintf.push_back(temp);
}   
void problem9(int total,int size)   
{   
    if(size != n )   
    {   
        if(total == 0)//判断背包是否正装满   
        {   
            count++;//存放可行方案的个数   
            print();//输出此可行解   
        }   
        else  
        {   
            problem9(total,size + 1);//未放入物品a【size】的情况   
            if(total - a[size] >= 0)//判断放入a【size】后,是否会超出背包的承载   
            {   
                b[size]++;//使得a【size】对应物品的数量加1   
                problem9(total - a[size],size);//放入物品a[size]的情况   
                b[size]--;//使得相应的物品数量减1   
            }   
        }   
    }   
  
}   
void main()   
{   
    int i,j;   
    scanf("%d",&n);   
    a = (int*)malloc(sizeof(int) * n);   
    b = (int*)malloc(sizeof(int) * n);   
    for(i = 0; i < n; i++)   
        scanf("%d",&a[i]);   
    for(j = 0; j < n; j++)   
        b[j] = 0;   
    problem9(1000,0);   
    printf("%d\n",count);   
	for (list<string>::iterator iter=meanprintf.begin();iter!=meanprintf.end();++iter)
		cout<<*iter<<endl;
}   

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值