hdu1085(求出最小不连续的值)

题目意思:

给出面值为1、2、5的个数n1,n2,n3求出最小不连续的值

http://acm.hdu.edu.cn/showproblem.php?pid=1085

题目分析:

方法一、多重背包问题的变形,状态转化方程为

if(a[i]==1) a[i+j*v]=1; (0<j<num[i],v为面值的值,v表示个数)

方法二、由于数据较小直接暴力

对于每一个值,从0到n模拟所有价值,并记录这个值,可以满足

AC代码:

/**

*1、类似背包问题

*if(a[i]==1) a[i+j*v]=1;(0<j<num[i],v为数值)

*2、暴力(由于数据较小可以直接暴力)

*/

#include<iostream>

#include<cstring>

using namespace std;

int a[8005];

/**

int main()//DP

{

int num[3],v[3]={1,2,5};

while(cin>>num[0]>>num[1]>>num[2]){

if(num[0]==0&&num[1]==0&&num[2]==0) break;

memset(a,0,sizeof(a));

int k,sum=0;

for(int i=0;i<3;i++){

sum+=num[i]*v[i];//计算最大数值

}

//cout<<sum<<endl;

a[0]=1;

for(int i=0;i<3;i++){//DP算法

for(int k=sum;k>=v[i];k--){

for(int j=1;j<=num[i];j++){

if(k-v[i]*j>=0) a[k]=a[k-v[i]*j];//当前状态取决于前一状态

}

}

}

for(int k=1;k<=sum+1;k++){//这里不能用sum

if(!a[k]){

cout<<k<<endl; break;

}

}

}

return 0;

}**/

int main()//暴力方法

{

int n,m,l;

while(cin>>n>>m>>l){

if(n+m+l==0) break;

memset(a,0,sizeof(a));

for(int i=0;i<=n;i++){

for(int j=0;j<=m;j++){

for(int k=0;k<=l;k++){

a[i*1+j*2+k*5]=1;

}

}

}

for(int k=1;k<=8001;k++){//这里不能用sum

if(!a[k]){

cout<<k<<endl; break;

}

}

}

return 0;

}

时间: 2024-08-22 02:27:42

hdu1085(求出最小不连续的值)的相关文章

44.从键盘输入12个数存入二维数组a[3][4]中,编写程序求出最大元素的值及它所在的行号和列号

//1.建立二维数组 //2.运用循环,将内容输入到数组中 //3.求出最大元素,并输出行号和列号 #include<iostream> using namespace std; int main() { int a[3][4]; int Max=0;//赋值之前需要先置为0 cout<<"please input 12 numbers: "<<endl; for(int i=0;i<3;i++)//嵌套循环,用于向二维数组中输入内容 { fo

hdu1599 find the mincost route floyd求出最小权值的环

find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3456    Accepted Submission(s): 1409 Problem Description 杭 州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为

含有n个元素的整型数组,将这个n个元素重新组合,求出最小的数,如{321,3,32},最小的数为321323

public class GetMinNumber { public static void main(String[] args) { String[] arr = null; System.out.println("输入一行待处理的整型数据,并以逗号隔开:"); Scanner input = new Scanner(System.in); arr = input.nextLine().split(","); sort(arr); for(String s :

给一个整形数组,给出一个值,当这个值是数组某些数字的和,求出数组下标的值

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

求出二维数组每一行的平均值

1 //二维数组每行输出平均值 2 //2017.3.7 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 void Rand(int arr[][100], int n); 7 void OutputAvg(int arr[][100], int n); 8 int main() 9 { 10 int arr[100][100]; 11 int n = 10; 12 int sum = 0; 13 //随机初始化数组 14 Rand(a

迭代加深搜索求字符串最小周期

1 //==================================================== 2 //迭代加深搜索求字符串最小周期: 3 //==================================================== 4 5 #include <stdio.h> 6 #include <Windows.h> 7 #include <stdlib.h> 8 9 int main() 10 { 11 char *str; 1

c编程:求出4&amp;#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

hdu1598find the most comfortable road(并查集+枚举,求起点到终点的边中最大边减最小边差值最小)

Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的"舒适度"有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ), 但XX星人对时间却没那么多要求.要你找出一条城市间的最舒适的路径.(