DP,基础简单背包问题。。。然后转移方程没错不知道wa在哪里。。。今晚吃齁了不想查。。。。。
*******************************************
用二维的今天早上仍旧不知道wa在哪里。改成一维的一下就跑过了。不懂为什么。然后就是其实每个数组都记录的是最优的状态。好像二维和一维的循环不大一样。再研究研究。
对的:
#include <stdio.h>
#include <iostream>
#include <cstring>
using namespace std;
#define maxn 1010
int dp[maxn],val[maxn],cost[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
int n,m,ans=0;
scanf("%d%d",&n,&m);
int i,j,k;
for(i=1;i<=n;i++) scanf("%d",&val[i]);
for(i=1;i<=n;i++) scanf("%d",&cost[i]);
for(i=1;i<=n;i++)
for(j=m;j>=cost[i];j--)
{
dp[j]=max(dp[j],dp[j-cost[i]]+val[i]);
}
//for(i=0;i<=m;i++) ans=max(ans,dp[i]);
printf("%d\n",dp[m]);
}
return 0;
}
错的:
#include <stdio.h>
#include <string.h>
#define maxn 1010
#define ll __int64
ll dp[maxn][maxn],val[maxn],cost[maxn];
ll max(ll x,ll y)
{
if(x>y) return x;
else return y;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,m;
ll ans=-1;
memset(dp,0,sizeof(dp));
memset(cost,0,sizeof(cost));
memset(val,0,sizeof(val));
scanf("%I64d%I64d",&n,&m);
int i,j,k;
for(i=1;i<=n;i++) scanf("%I64d",&val[i]);
for(i=1;i<=n;i++) scanf("%I64d",&cost[i]);
for(i=1;i<=n;i++)
for(j=m;j>=cost[i];j--)
{
dp[i][j]=max(dp[i][j],dp[i-1][j-cost[i]]+val[i]);
if(i==n) ans=max(ans,dp[i][j]);
}
printf("%I64d\n",ans);
}
return 0;
}