题目:
新年趣事之打牌
新年趣事之打牌
新年趣事之打牌
新年趣事之打牌
代码如下:

#include<bits/stdc++.h>
using namespace std;
#define MAX 2000005
int dp[MAX],a[MAX],path[MAX],res;
void print(int k)
{
	if(k){
		print(k - a[path[k]]);//找到上一个质量 
		if(k == res) cout << path[k];//最后一个不输出空格 
		else cout << path[k] << " ";
	}
}
int main()
{
	int total,n,sum = 0;
	cin >> total >> n;
	for(int i = 1;i <= n;i++) cin >> a[i],sum += a[i];
	res = sum - total;//res代表丢失牌总质量	
	dp[0] = 1;//dp[i]代表丢失质量为i的牌的可能数
	for(int i = 1;i <= n;i++){
		for(int j = res;j >= a[i];j--){
			dp[j] += dp[j - a[i]];
			if(dp[j] > 5) dp[j] = 2;//这里不关心方案数,为了防止数量过大需要及时缩小
			if(!path[j] && dp[j - a[i]]) path[j] = i;//path[j]代表达到重量j时需要第i张牌 
		}
	} 
	if(!dp[res]) cout << "0" << endl;
	else if(dp[res] > 1) cout << "-1" << endl;
	else print(res);
	return 0; 
} 

就是一道0 - 1背包问题,单数这里需要记录过程,所以用到path数组,最后递归打印。

相关文章:

  • 2022-02-09
  • 2022-12-23
  • 2021-11-09
  • 2021-12-04
  • 2021-07-25
  • 2022-01-22
  • 2022-01-02
猜你喜欢
  • 2021-06-12
  • 2022-12-23
  • 2022-02-12
  • 2022-12-23
  • 2021-04-11
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案