刚开始接触动态规划,自学的。感觉真心难。这两天弄了个最短路径一个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");
}
}