多重背包_P1077_摆花_P2347砝码称重

题目描述

小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共mm盆。通过调查顾客的喜好,小明列出了顾客最喜欢的nn种花,从11到nn标号。为了在门口展出更多种花,规定第ii种花不能超过a_iai​盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。

试编程计算,一共有多少种不同的摆花方案。

输入格式

第一行包含两个正整数nn和mm,中间用一个空格隔开。

第二行有nn个整数,每两个整数之间用一个空格隔开,依次表示a_1,a_2,…,a_na1​,a2​,…,an​。

输出格式

一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对10000071000007取模的结果。

输入输出样例

输入 #1复制

2 4
3 2

输出 #1复制

2

说明/提示

【数据范围】

对于20%数据,有0<n≤8,0<m≤8,0≤a_i≤80<n≤8,0<m≤8,0≤ai​≤8;

对于50%数据,有0<n≤20,0<m≤20,0≤a_i≤200<n≤20,0<m≤20,0≤ai​≤20;

对于100%数据,有0<n≤100,0<m≤100,0≤a_i≤1000<n≤100,0<m≤100,0≤ai​≤100。

解题思路 :多重背包问题求恰好装满的方案总数(多重背包计数问题)

可以把这道题看做 二维Dp,定义 f[i,j]:前i 种花瓶,拜访成 j个的 方案数

  状态转移方程 f[i,j] = sum(f[i-1,j-i])   sum是求和,  1<=i<= cnt[i]   

 改进:使用 滚动数组+从后往前 遍历  优化 空间复杂度

f[j] = sum(f[j-i])   1<=i<= cnt[i]   

初始化 f[0] =1  一个不摆,也是一种方案!

#include<iostream>
#define maxn 120
using namespace std;
int nums[maxn];
int dp[maxn];
const int mod =1000007; 
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>nums[i];
	dp[0] = 1;
	for(int i=1;i<=n;i++)
		for(int j=m;j>=1;j--)
			for(int k =1;k<=min(nums[i],j);k++)
				dp[j] = (dp[j]+dp[j-k]) % mod;
	cout<<dp[m];
	return 0;
}

题目描述

设有1g1g、2g2g、3g3g、5g5g、10g10g、20g20g的砝码各若干枚(其总重\le 1000≤1000),

输入格式

输入方式:a_1 , a_2 ,a_3 , a_4 , a_5 ,a_6a1​,a2​,a3​,a4​,a5​,a6​

(表示1g1g砝码有a_1a1​个,2g2g砝码有a_2a2​个,…,20g20g砝码有a_6a6​个)

输出格式

输出方式:Total=NTotal=N

(NN表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)

输入输出样例

输入 #1复制

1 1 0 0 0 0

输出 #1复制

Total=3

解题思路: 设置 bool dp[i] if 总i 质量的可以得到的话 ,设置为 1  否则设置为0 

                    状态转移方程 dp[k-j*w[i]]==1 dp[k] = 1    1<=j<=nums[i]  k>=j*w[i]

初始化设置为 dp[0] = 1;

结果是 统计 dp[i] 1<=i<=sum 中等于一的个数

#include<iostream>
#define maxn 1005
using namespace std;
int w[6] = {1,2,3,5,10,20};
int nums[6];
int dp[maxn];
int main(){
	int sum = 0;
	for(int i=0;i<6;i++){
		cin>>nums[i];
		sum +=w[i] * nums[i]; 
	}
	int ans = 0;	
	dp[0] = 1;
	for(int i=0;i<6;i++)
		for(int j=1;j<=nums[i];j++)
			for(int k=sum;k>=j*w[i];k--)
				if(dp[k-j*w[i]]) dp[k] = 1;
	for(int i=1;i<=sum;i++)
		if(dp[i])
			ans++;
	cout<<"Total="<<ans;
	return 0;
} 

             

发布了124 篇原创文章 · 获赞 47 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/ludan_xia/article/details/105062006