(动态规划)求有多少种不同的凑法
2017-04-04 23:32
190 查看
一个包可以装mg的东西,有n个物品,体积分别是a1,a2....an,要求选择的物品体积正好是m并且每个物品只能选择一次,一共有多少种不同的凑法?
思路:
如果m是0,则一个物品都不用选,return 1;
如果所有的物品都选上了,还不够m就return 0;
否则 如果不选第n个物品则选n-1个物品组成m加上选了第n个物品,那么就只需要选n0-1个组成m-a
;
递归程序如下:
#include<iostream>
using namespace std;
int a[30];
int n;
int f(int m,int n)
{
if(m==0)return 1;
if(n<=0)return 0;
else return f(m,n-1)+f(m-a
,n-1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}cout<<f(40,n);
return 0;
} DP解法:
好像还有点问题,待解决........
#include<iostream>
#include<cstring>
using namespace std;
int a[30],f[40][30];
int n;
int main()
{
cin>>n;
memset(f,0,sizeof(f));
for(int i=1;i<=n;++i)
{
cin>>a[i];
f[0][i]=1;
}
f[0][0]=1;
for(int m=1;m<=40;++m)
{
for(int k=1;k<=n;++k)
{
f[m][k]=f[m][k-1];
if(m-a[k]>=0)
f[m][k]+=f[m-a[k]][k-1];
}
}
cout<<f[40]
;
return 0;
}
思路:
如果m是0,则一个物品都不用选,return 1;
如果所有的物品都选上了,还不够m就return 0;
否则 如果不选第n个物品则选n-1个物品组成m加上选了第n个物品,那么就只需要选n0-1个组成m-a
;
递归程序如下:
#include<iostream>
using namespace std;
int a[30];
int n;
int f(int m,int n)
{
if(m==0)return 1;
if(n<=0)return 0;
else return f(m,n-1)+f(m-a
,n-1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}cout<<f(40,n);
return 0;
} DP解法:
好像还有点问题,待解决........
#include<iostream>
#include<cstring>
using namespace std;
int a[30],f[40][30];
int n;
int main()
{
cin>>n;
memset(f,0,sizeof(f));
for(int i=1;i<=n;++i)
{
cin>>a[i];
f[0][i]=1;
}
f[0][0]=1;
for(int m=1;m<=40;++m)
{
for(int k=1;k<=n;++k)
{
f[m][k]=f[m][k-1];
if(m-a[k]>=0)
f[m][k]+=f[m-a[k]][k-1];
}
}
cout<<f[40]
;
return 0;
}
相关文章推荐
- 20170801_动态规划之爬楼梯有多少不同的方法
- 俩个int型变量m,n中有多少个bit位不同。
- MyBatis知多少(9)不同类型的数据库
- 随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
- 一个圆上的n个不同点可以连成多少条不相交的线段
- 9.9递归和动态规划(二)——有个机器人坐在X*Y网格的左上角,只能向右、向下移动,机器人从(0,0)到(X,Y)有多少种走法
- 给定一个英文原文,统计文件里面一共有多少个不同的英文单词
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 一个人走一个n阶的楼梯,他一步可以走1阶,2阶,3阶,这三种情况,问走完这n阶的楼梯共有多少种不同的走法?
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- SPOJ3267 D-Query 树状数组离线操作 或 主席树 查询某一区间内有多少不同的数
- 有多少个不同的子串?-- 后缀数组
- [导入]给定一个英文原文,统计文件里面一共有多少个不同的英文单词
- 编程实现:在32bit编程环境下,两个int型整数的二进制码有多少位不同
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 有多少位不同
- 用C语言数组求4个不同的数字能组成多少个不同的4位数
- 多少个0(动态规划初步)
- 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1(ccf真题)
- 整数A和B的二进制表示中有多少位是不同的