【OJ】DP 01背包 记忆化搜索 O(nW)

简介: 题目链接:点击打开链接/* 01背包 记忆化搜索 O(nW)*/#include#include#include#define MAX_N 101#define MAX_W 3001using namespace std;//最多有3000元,dp[...
题目链接:<a target=_blank href="http://hzu.acmclub.com/index.php?app=problem_title&id=538&problem_id=6042">点击打开链接</a>

/*
	01背包 记忆化搜索 O(nW)
*/
#include<iostream>
#include<algorithm>
#include<string.h>
#define MAX_N 101
#define MAX_W 3001
using namespace std;//最多有3000元,dp[][3001]<-solve(0,3000)
int w[101],v[101],n,W,dp[MAX_N][MAX_W];
int solve(int i,int ww){
	if(dp[i][ww]>=0)return dp[i][ww];//已有,直接返回 
	if(i==n) return dp[i][ww]=0;
	else if(ww<w[i])return dp[i][ww]=solve(i+1,ww);
	else return dp[i][ww]=max(solve(i+1,ww),solve(i+1,ww-w[i])+v[i]);
}
int main(){
	freopen("DP 01.txt","r",stdin); 
	int num=0,t;cin>>t; 
	while(t--){
        num++;
		memset(dp,-1,sizeof(dp));//memset int只能0和-1,能所有char 
		int ans=0;cin>>W>>n;
		for(int i=0;i<n;i++)cin>>w[i];
		for(int i=0;i<n;i++)cin>>v[i];
		ans=solve(0,W);
        cout<<"Case #"<<num<<": "<<ans<<endl;
		for(int i=0;i<=n;i++){
			for(int j=0;j<=W;j++)
				printf("%3d",dp[i][j]);		
			putchar('\n');
		}
	}
	return 0;
}

目录
相关文章
|
6月前
|
决策智能
【dp】背包问题
【dp】背包问题
323 2
|
6月前
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
动态规划(DP)——区间DP
动态规划(DP)——区间DP
|
6月前
|
机器学习/深度学习 存储
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
25 0
|
8月前
|
人工智能 BI
动态规划(DP)——背包问题
动态规划(DP)——背包问题
|
8月前
|
人工智能
动态规划(DP)——线性DP
动态规划(DP)——线性DP
|
10月前
|
机器学习/深度学习
[LeeCode][动态规划][简单] 杨辉三角
[LeeCode][动态规划][简单] 杨辉三角
37 0
|
10月前
[LeeCode][动态规划][简单]上楼梯
[LeeCode][动态规划][简单]上楼梯
43 0
|
11月前
|
机器学习/深度学习 人工智能
51nod 1055 最长等差数列 (dp好题)
51nod 1055 最长等差数列 (dp好题)
32 0
(闫氏dp分析法)AcWing 2. 01背包问题
(闫氏dp分析法)AcWing 2. 01背包问题
39 0