多重部分和问题 dp

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <climits>
#include <cstring>
#include <cmath>
#include <map>
#include <set>

using namespace std;
int n,k;
int a[100];
int m[100];
int dp[100];

int main(){
	while(cin >> n){
		for(int i = 0;i < n;i++){
			cin >> a[i];
		}
		for(int i = 0;i < n;i++){
			cin >> m[i];
		}
		cin >> k;
		/*
		dp[i][j] 代表的是用前i个数字要组成j,i剩下最多的个数不能构成的时候为-1
		则有if(dp[i][j] >= 0){
				dp[i+1][j] = m[i];//当前i-1个数已经能构成k的时候后面就不需要了
			}
			else if(j < a[i] || dp[i][j-a[i]] < 0){
				dp[i+1][j-a[i]] = -1;
			}
			else {
				dp[i+1][j] = dp[i+1][j-a[i]] - 1;
			}
		从这个就可以看出来可以使用一维的状态数组存储
		*/
		for(int i = 0;i < n;i++){
			for(int j = 0;j <= k;j++){
				if(dp[j] >= 0){
					dp[j] = m[i];
				}
				else if(j < a[i] || dp[j - a[i]] <= 0){
					dp[j] = -1;
				}
				else {
					dp[j] = dp[j-a[i]] - 1;
				}

			}
		}
		if(dp[k] >= 0){
			printf("YES\n");
		}
		else{
			printf("NO\n");
		}
	}
	return 0;
}

时间: 2024-08-07 04:08:12

多重部分和问题 dp的相关文章

POJ 1742 Coins ( 经典多重部分和问题 &amp;&amp; DP || 多重背包 )

题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额? 分析 : 这题可用多重背包来解,但这里不讨论这种做法. 如果之前有接触过背包DP的可以自然想到DP数组的定义 ==> dp[i][j] 表示使用前 i 种硬币是否可以凑成面额 j . 根据这样的定义,则一开始初始化 dp[0][0] = true 最后统计 dp[n][1 ~ m] 为 true 的数量即为答案 状态转移方程为 dp[i][j] |= dp[i-1][ j - k*val[i

编程算法 - 多重部分和问题 代码(C)

多重部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n种不同大小的数字a, 每种各m个. 判断是否可以从这些数字之中选出若干使它们的和恰好为K. 使用动态规划求解(DP), 方法1: dp[i+1][j] = 用前n种数字是否能加和成j, 时间复杂度O(nKm), 不是最优. 方法2: dp[i+1][j] = 用前i种数加和得到j时, 第i种数最多能剩余多少个. 时间复杂度O(nK). 例如: n=3, a={3,5,8},

HDU1059——多重部分和问题——Dividing

Problem Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same value, because then they could

多重部分和 poj1742

Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some coins.He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact pri

POJ1742 coins 动态规划之多重部分和问题

原题链接:http://poj.org/problem?id=1742 题目大意:tony现在有n种硬币,第i种硬币的面值为A[i],数量为C[i].现在tony要使用这些硬币去买一块价格不超过m的表.他希望买的时候不用找零,问有多少种价格能满足这一点. 这个问题实际上是一个多重部分和的问题:假设有n种物品,每种物品的价值为v[i],数量为c[i],随意选取这些物品,能否使它们的价值之和恰好为m.使用动态规划的思想来求解这类问题: 定义dp数组,dp[i][j]的值代表前i种物品随意选取,价值之

COJ 0557 4013多重部分和问题

4013多重部分和问题 难度级别:B: 运行时间限制:2000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 n种大小不同的数字 Ai,每种各Mi个,判断是否可以从这些数字之中选出若干个使他们的和恰好为K. 输入 第一行为两个正整数n,K.第二行为n个数Ai,以空格隔开.第三行为n个数Mi,以空格隔开. 输出 若可行则输出"yes"否则输出"no" 输入示例 3 173 5 83 2 2 输出示例 yes 其他说明 1<=n

14年省赛---多重部分和问题(多重背包+二进制优化)

1210: F.多重部分和问题 时间限制: 1 Sec  内存限制: 64 MB提交: 18  解决: 14 题目描述 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. 输入 首先是一个正整数T(1<=T<=100)接下来是T组数据 每组数据第一行是一个正整数n(1<=n<=100),表示有n种不同大小的数字 第二行是n个不同大小的正整数ai(1<=ai<=100000)第三行是n个正整数mi(1<=mi<=100000

hdu 3591 多重加完全DP

题目: The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1997    Accepted Submission(s): 711 Problem Description In the country of ALPC , Xiaoqian is a very famous mathematici

POJ1742(多重部分和问题:模板题)

Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 32776   Accepted: 11131 Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some