我知道本吧大牛多,所以就进来打酱油了,你们要爱我噢。
原题:
公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
2 2
5 0
输入:
2
500
800
则应输出:
1
2 0
我的代码
#include"iostream"
using namespace std;
#define N 1000 //N存储总钱1000
int a[100],b[100][100]={0},n,p=1,q=1; //a数组存商品价格,b数组存商品数量 p,q为b数组下标
int dex[100]; //记录一种方案对应商品的数量
void DLS(int a[],int money)
{
int i,j;
for(i=1;i<=n;i++)
{
if((money+a[i])<=N)
{
if(N==(money+a[i])) //找到了一种方案;
{
dex[i]++;
for(j=1;j<=n;j++) //存一种方案下标
b[p][j]=dex[j];
p++;
}
else
{
money+=a[i];
dex[i]++;
DLS(a,money);
dex[i]--;
}
}
}
}
int main()
{
int i=0,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
DLS(a,0);
cout<<p-1<<endl; //总共有多少个方案
for(i=1;i<p;i++)
{
for(j=1;j<=n;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
return 0;
}


我想说的是。。这两个都不是我要的答案。。以下是我想使用回溯法推测,(如果推错了请指点)
输入 2
200
800
理论上应该有3中方案的。
1,200 200 200 200 200 200
2,200 800
800 200 输入 2 200 300 理论上应该有5种答案,
1 200 200 200 200 200
2,200 200 300 300
3,200 300 200 300
4 300 200 200 300
5 300 300 200 200
请大牛指点 小弟感激不尽,临表涕零。
原题:
公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
2 2
5 0
输入:
2
500
800
则应输出:
1
2 0
我的代码
#include"iostream"
using namespace std;
#define N 1000 //N存储总钱1000
int a[100],b[100][100]={0},n,p=1,q=1; //a数组存商品价格,b数组存商品数量 p,q为b数组下标
int dex[100]; //记录一种方案对应商品的数量
void DLS(int a[],int money)
{
int i,j;
for(i=1;i<=n;i++)
{
if((money+a[i])<=N)
{
if(N==(money+a[i])) //找到了一种方案;
{
dex[i]++;
for(j=1;j<=n;j++) //存一种方案下标
b[p][j]=dex[j];
p++;
}
else
{
money+=a[i];
dex[i]++;
DLS(a,money);
dex[i]--;
}
}
}
}
int main()
{
int i=0,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
DLS(a,0);
cout<<p-1<<endl; //总共有多少个方案
for(i=1;i<p;i++)
{
for(j=1;j<=n;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
return 0;
}


我想说的是。。这两个都不是我要的答案。。以下是我想使用回溯法推测,(如果推错了请指点)
输入 2
200
800
理论上应该有3中方案的。
1,200 200 200 200 200 200
2,200 800
800 200 输入 2 200 300 理论上应该有5种答案,
1 200 200 200 200 200
2,200 200 300 300
3,200 300 200 300
4 300 200 200 300
5 300 300 200 200
请大牛指点 小弟感激不尽,临表涕零。