用c实现南阳oj1221 找数达人 01背包问题。

刚开始接触动态规划,自学的。感觉真心难。这两天弄了个最短路径一个01背包,唉~~~菜。刚开始看到这道题,没什么思路,不知道怎么去找他的状态以及状态方程,然后看了下大神们的思路。说是01背包问题。我特么01背包是个什么东西呢。然后接着又先把01背包给实现了。然后上面说是这个问题只是 物品重量和价值相等。然后自己想了想把代码写出来咯~~~~还是不错滴。

大家这题看不懂可以先看看 01背包的解法 http://blog.csdn.net/mu399/article/details/7722810这里的讲的不错。推荐大家先看一下这个。                                                          

       找数达人

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

小明最近做出了一道题:如何在一组数中寻找三个数,这三个数的和等于一给出的定值m,洋洋得意。于是小华不乐意了,小华说,你能找找在一组数字中是否有n个数,使得这n个数的和等于一给定的定值m吗?

 1.0 < 数字大小 <= 1000

 2. 0 < 序列中数字个数 <= 1000

 3. 0 <= m <=1000

输入
多组数据,每组两行,第一行为序列内容,第二行为m的值。
输出
如能找到,输出Yes,否则,输出No。
#include<stdio.h>
#include<string.h>
int main()
{
	int n,c;
	int w[1000],v[1000],d[1000][100];//存储背包的重量和价值这里他们相同。d[i][j]表示 剩余容量为j的背包在前i个数选取出的最大价值。
	char a[100000];//这里是要字符串输入。
	
	while(gets(a)!=NULL)
 {   
          n=1;//记录多少个数字。
    
	 int sum,i=0,l=strlen(a);;
	 while(i<l)
	 {  sum=0;
        while(a[i]!=' '&&a[i]!='\0')	 
	 	{
	 	  sum=sum+a[i]-'0';
	      if(a[i+1]!=' '&&a[i+1]!='\0')
		    sum=sum*10;
		    
		    i++;
		 }if(i!=0) w[n]=sum,v[n++]=sum;
	
		 i++;
		 
	 }//这一段是将字符型数字转换成整形。
memset(d,0,sizeof(d));
   scanf("%d",&c);
   getchar(); //接收后面那个回车.
   int T=0;
   for(int i=1;i<n;i++)
        {
          for(int j=1;j<=c;j++)
		     {
				if(j>=w[i]) 
				{ 
				   if(d[i-1][j-w[i]]+v[i]>d[i-1][j])	
				        d[i][j]=d[i-1][j-w[i]]+v[i];
					else 
				
						d[i][j]=d[i-1][j];
			   	
			   } 
			   else 
			   {
			   	d[i][j]=d[i-1][j];
			   }  
			   
			   if(d[i][j]==c) T=1;
			
	    	}
		}//此处就是根据01背包的状态转移方程填写数组。
	if(T==1)printf("Yes\n");
            else printf("No\n");
 }	 
	  
	     
	   
	
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值