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; }