hdoj1114(非备忘录式的dp)

来源:互联网 发布:暴雪游戏mac 编辑:程序博客网 时间:2024/04/26 21:38
#include<iostream>#include<stdio.h>using namespace std;#define MAX 10001//#define MAX 1000class Point{public:int v;int w;};Point money[MAX];int W;int dp[MAX];void init(){int i=0;for(i=0;i<MAX;i++)dp[i]=-1;}int main(){//freopen("in2.txt","r",stdin);int T;scanf("%d",&T);while(T--){int a;int b;scanf("%d %d",&a,&b);W=b-a;int N;scanf("%d",&N);int i;int min=MAX;for(i=0;i<N;i++){scanf("%d %d",&money[i].v,&money[i].w);if(min>money[i].w){min=money[i].w;}}init();int j,k;dp[0]=0;for(k=min;k<=W;k++){for(j=0;j<N;j++)//选择第j件东西{i=k-money[j].w;if(dp[i]<0||i<0)continue;if(dp[i]+money[j].v<dp[k]||dp[k]<0){dp[k]=dp[i]+money[j].v;}}}        if (dp[W] == -1)            cout << "This is impossible.\n";        else            cout << "The minimum amount of money in the piggy-bank is " << dp[W] << ".\n";}return 0;}/*1 k是什么东西。貌似是最小的物品的重量。也就是当前背包的重量2 i表示剩下的背包的重量。3 这个问题跟我的想法不太一样,它是从最底层开始,一个一个向上加出来的。4 在VC中int a,int b;是可以的,但是在dev中不行*/

原创粉丝点击