• 背包问题 洛谷P1164 小A点菜


    题目链接:
    https://www.luogu.org/problem/P1164
    参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ans;//菜的种类和口袋里的钱,种类数
    int a[110],f[110][110]={0};
    void dfs(int x,int m)
    {
    	if(m==0) { ans++;return;}
    	if(x<1)return;//走完了
    	dfs(x-1,m);//不选
    	if(m>=a[x])  dfs(x-1,m-a[x]);//选
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		cin>>a[i];
    	dfs(n,m);
    	cout<<ans;
    	return 0;
    }
    

    ——————————————————————————

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[110],f[110];
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		cin>>a[i];
    	for(int i=1;i<=n;i++)
    	{
    		f[0]=1;
    		//当前第i种物品恰好为j元钱,所以可以只买它自己。这种情况其实包含在1中,但是由于f[i][0]=0,
    		//所以不会算入这种情况。所以我们要把所有的f[i][0]更新成1,
    		for(int j=m;j>=a[i];j--)
    			f[j]+=f[j-a[i]];//累加方案,现在的花费+=我不点这个菜的时候的花费
    	}
    	cout<<f[m];
    	return 0;
    }
    

    (1)if(j==第i道菜的价格)f[i][j]=f[i-1][j]+1;

    (2)if(j>第i道菜的价格) f[i][j]=f[i-1][j]+f[i-1][j-第i道菜的价格];

    (3)if(j<第i道菜的价格) f[i][j]=f[i-1][j];
    参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    int a[101],f[101][10001]={0};
    int main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;++i)cin>>a[i];
        for(int i=1;i<=n;++i)
          for(int j=1;j<=m;++j)
          {
              if(j==a[i])f[i][j]=f[i-1][j]+1;
              if(j>a[i]) f[i][j]=f[i-1][j]+f[i-1][j-a[i]];
              if(j<a[i]) f[i][j]=f[i-1][j];
          }
        cout<<f[n][m];
        return 0;
    }
    
  • 相关阅读:
    最大子序列和问题之算法优化
    数据揭秘:低学历成功逆袭概率有多少?感谢父母送我读书!
    据说这份高考卷,只有程序员能得满分!
    牛客OI赛制测试赛2
    斯特林公式
    N!的近似值_斯特林公式
    矩阵快速幂
    回文树
    回文树入门
    环和链的判断
  • 原文地址:https://www.cnblogs.com/yonglin1998/p/11780805.html
Copyright © 2020-2023  润新知