笔试编程题目

(1)拼凑面额

 1)暴力递归:O(aim^N):70%

2)记忆化搜索:O(N*aim^2):80%

3)动态规划:O(N*aim),O(N*aim) dp[i][j] = dp[i-1][j] + dp[i][j-arr[i]] 

4)动态规划+空间压缩:O(N*aim),O(aim)

#include<iostream>
#include<vector>
using namespace std;
#define MAX 10001
#define n 6
int arr[n] = {1,5,10,20,50,100};
long coins1(int index,int aim)//暴力递归,case:70%
{
    int i;
    long res=0;
    if(index==n)
	res= aim==0?1:0;
    else{    
	for(i=0;arr[index]*i<=aim;i++)
	{
       	    res+=coins1(index+1,aim-arr[index]*i);
    	}
    }
    return res;   
}
long coins2(int index,int aim)//记忆搜索 90ms,776k
{
    int i;
    long res=0;
    long map[n+1][aim+1]={0};
    if(index==n)
	res= aim==0?1:0;
    else
    {    
	for(i=0;arr[index]*i<=aim;i++)
	{
	    int value = map[index+1][aim-arr[index]*i] ;
 	    if(value!=0)
	    {
		res += value==-1?0:value;
	    }
       	    else
              res+=coins2(index+1,aim-arr[index]*i);
	    map[index][aim] = res==0?-1:res;
    	}
    }
    return res;   
}
long search1(int aim)//动态规划1  运行时间:4ms 占用内存:896k
{
	int i,j;
	long dp[n][aim+1];
	for(j=0;j<n;j++)
	{
		dp[j][0]=1;
	}
	for(i=0;arr[0]*i<=aim;i++)
	{
		dp[0][arr[0]*i] = 1;
	}
	
	for(i=1;i<n;i++)
	{
		for(j=1;j<=aim;j++)
		{
			dp[i][j] = dp[i-1][j];
			dp[i][j] += j-arr[i]>=0?dp[i][j-arr[i]]:0;
		}
	}
	return dp[n-1][aim];
}
long search2(int aim)//空间压缩 运行时间:3ms 占用内存:616k
{
	int i,j;
	long dp[aim+1];
	for(j=0;arr[0]*j<=aim;j++)
		dp[arr[0]*j] = 1;
	for(i=1;i<n;i++)
		for(j=1;j<=aim;j++)
			dp[j]+=j-arr[i]>=0?dp[j-arr[i]]:0;
	return dp[aim];
}
int main()
{
    int i,N;
    long sum;
    cin>>N;
    if(N<0)
	sum = 0;
    else
    { 
        //sum = coins1(0,N);
        //sum = coins2(0,N);
        //sum = search1(N);
        sum = search2(N);
    }
    cout<<sum<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值