http://poj.org/problem?id=2063
题目大意:是说给你一笔钱,让你放银行里面,然后给你几种债券的方案,问几年后本息和最多能有多少。
其实就是完全背包问题,这里注意一下,memset比较耗时,所以要改为for循环。
<pre name="code" class="cpp">#include<iostream>
#include<stdio.h>
#include<string.h>
#define max(a,b) ((a>b)?(a):(b))
using namespace std;
int v[15],w[15];
int dp[1000000];
int sum;
int main()
{
int i,j,t,n,m,nsum;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&sum,&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&v[i],&w[i]);
v[i]/=1000;
}
for(i=0;i<1000000;i++)
dp[i]=0;
while(n--)
{
nsum=sum/1000;
for(i=0;i<m;i++)
{
for(j=v[i];j<=nsum;j++)
{
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
sum+=dp[nsum];
//printf("%d\n",sum);
}
printf("%d\n",sum);
}
}