IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [Acwing|蓝桥] 1243. 糖果 状态压缩+01背包 -> 正文阅读

[数据结构与算法][Acwing|蓝桥] 1243. 糖果 状态压缩+01背包

前言

传送门 :

思路

因为数据范围很小, 我们考虑使用 d p dp dp

显然对于每袋 糖果 有 拿和不拿两种状态 , 所以需要使用 背包

同时,又因为 需要 表示当前状态 ,所以考虑使用 状态压缩

状态表示 :
d p [ N ] [ 1 < < M ] dp[N][1<<M] dp[N][1<<M] 表示 从前 i i i袋糖果选,状态为 s s s的最小集合

状态计算 :
d p [ i ] [ s ] = m i n ( d p [ i ] [ s ] , d p [ i ? 1 ] [ s & ( ? w [ i ] ) ] + 1 ) ( ? w [ i ] 表 示 按 位 取 反 , L a t e x 打 不 出 来 dp[i][s] =min(dp[i][s],dp[i-1][s\&(-w[i])]+1)(-w[i]表示按位取反,Latex打不出来 dp[i][s]=min(dp[i][s],dp[i?1][s&(?w[i])]+1)(?w[i],Latex

因为 N = 100 N=100 N=100 ,因为空间开销 2 20 ? N 2^{20}*N 220?N 会寄

所以考虑优化 1 1 1维,当然我们跟着 背包 倒序转移即可

Mycode

// Problem: 糖果
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/1245/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define IOS  ios::sync_with_stdio(false);
#define CIT  cin.tie(0);
#define COT  cout.tie(0);

#define ll long long
#define x first
#define y second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(),x.end()
#define Fup(i,a,b) for(int i=a;i<=b;i++)
#define Fde(i,a,b) for(int i=a;i>=b;i--)

typedef priority_queue<int,vector<int>,greater<int>>  Pri_m;
typedef pair<int,int> pii;
typedef vector<int> VI;
map<int,int> mp;
const int N = 110,M  =(1<<20)+10 , INF = 0x3f3f3f3f;
int w[N],f[M],n,m,k;

void solve(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=k;j++){
			int x;cin>>x;
			w[i]|=  1<<x-1;
		}
	}
	
	memset(f,0x3f,sizeof f);
	f[0] = 0 ;
	for(int i=1;i<=n;i++)
		for(int s = (1<<m);s>0;s--)
		f[s] = min(f[s],f[s&(~w[i])]+1);
		
	if(f[(1<<m)-1] == INF)cout<<-1<<endl;
	else cout<<f[(1<<m)-1]<<endl;
	
}

int main(){
    //int t;cin>>t;while(t--)
    solve();
    return 0 ;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:44:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:58:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码