#include<stdio.h>
struct WORK
{
int begin;
int end;
int value;
};
int main()
{
int i;
WORK worke[5];
for(i=0; i<5; i++)
scanf("%d%d%d",&worke[i].begin,&worke[i].end,&worke[i].value);
for(i=0; i<5; i++)
printf("%d,%d,%d\n",worke[i].begin,worke[...
引题 http://bbs.bccn.net/viewthread.php?tid=414177&extra=&page=1
加工工件获取最大价值的问题,为了便于理解学习核心的部分,把题目分解:
开始时间,结束时间,加工工件价值,分别用三个数组表示。
以结束时间排序好。
动态转移方程直接在递归式中表现。 f(i,j)表示至第i个工件时结束时间为j时
累加最大价值。
主要意思是,选取第i个工件时,和不取第i个工件时情况的价值中取较大值。
通俗的讲,当取第i个工件时,此时选取后的 j 值为第i个工件的开始时间,不选 i工件 时此时的j值为(i-1)工件的结束时间。
#in...
开始学习编程时曾经练习过此类题,采用的是蛮力法,虽说找的数较全,但因指数级数据处理相当复杂且相当有限,现用动态规划处理,暂时没考虑标记所取的数。
#include <stdio.h>
#include <math.h>
double v[100];
double total(int i,double j)
{
double l,r,t;
if(i==-1||j==0) return 0;
l=total(i-1,j);r=total(i-1,j-v[i])+v[i];
t=fabs(l-j)<fabs(r-j) ? l:r;
return ...
01背包动态规划思维不同于常规思维,需要学习前人的研究成果,但只要认真,看下百度百科,掌握了方法及参数的内容,基本上就差不多了,动态转移方程的理解熟悉后其实就能直接理解。
通过实例学习,
序號(i) 單個物重量w(i) 單個物品價值v(i)
1 22 15
2 18 18
3 9 10
4 24 13
5 15 20
包能承最大重35
求total(5,35)...
有数列a(n)满足:2a(n)-a(1)=s(n)s(1);其中n是正整数,s(n)为各项之和,a(1)不等于0;
1,求,a(1),a(2)的值;
并求,a(n)的通项;
2,求数列n*a(n)各项之和;
以下为递归实现。
#include<stdio.h>
int s(int n);
int sum(int n);
int f(int n)//a( n)=s(n-1)+1
{
if(n==1) return 1;
return s(n-1)+1;
}
int s(int n)//s(n)=s(n-1)+a(n)
{
if(n...